Mam DataTable
która jest wypełniona ze zdalnego JSON DataSource
:przeciek pamięci z DataTable i DataSource z odpytywania
var dataSource = new Y.DataSource.Get({ source: url });
dataSource.plug(Y.Plugin.DataSourceJSONSchema, {
schema: {
resultListLocator: "results",
resultFields: [ "field1", "field2" ]
}
});
var table = new Y.DataTable({ columns = ["col1", "col2"] }
table.plug(Y.Plugin.DataTableDataSource, { datasource: dataSource });
table.render("#table");
table.datasource.load({ request: query });
Próbuję mieć dane w tabeli okresowo odświeżane. A forum poster recommended calling load periodically, które próbowałem i działa tak, jak miałem nadzieję (dane są odświeżane bez wyświetlania komunikatu Ładowanie ...).
Y.later(1000/*ms*/, table.datasource, table.datasource.load, { request: query }, true);
Jednak zauważyłem wyciek pamięci w Chrome. Komórki tabeli nie wydają się być usunięte z pamięci. Profiler stosu w przeglądarce Chrome zgłasza wiele obiektów HTMLTableCellElement
w lokalizacji Detached DOM tree
.
Czy to najlepsza metoda odświeżania danych? Jeśli tak, czy istnieje sposób na wyczyszczenie starych komórek tabeli?
Alternatywy
Istnieje również datatable-polling
module że można robić okresowe sprowadzanie danych. Nie mogę jednak podać przykładów tego, jak to ma być używane z YUI3 DataTable
. Jednak examples from YUI2 pokazać można zrobić coś dodaje, który wydaje się działać:
dataSource.setInterval(1000,
{
request: query,
callback:
{
success: function(e) { table.onDataReturnInitializeTable },
failure: function() { Y.log("Polling failure", "error"); }
}
});
Jednak wygląda na to, to jest właśnie to, co load
is doing under the hood anyway:
load: function(config) {
config = config || {};
config.request = config.request || this.get("initialRequest");
config.callback = config.callback || {
success: Y.bind(this.onDataReturnInitializeTable, this),
failure: Y.bind(this.onDataReturnInitializeTable, this),
argument: this.get("host").get("state") //TODO
};
var ds = (config.datasource || this.get("datasource"));
if(ds) {
ds.sendRequest(config);
}
},
Tak więc, aby potwierdzić, 'load' powinno być odpowiedzialne za wyczyszczenie pamięci używanej przez wiersze, które są wymieniane? – SimonC
W rzeczywistości odpowiedzialny za to jest 'datatable.render', a kiedy wywołujesz' datatable.datasource.load', 'render' jest wywoływany pod maską. Więc tak. – juandopazo