Ho un DataTable
che è popolata da un JSON remota DataSource
:Perdita di memoria con DataTable e DataSource con polling
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 });
Sto cercando di avere i dati nella tabella aggiornata periodicamente. A forum poster recommended calling load periodically, che ho provato e funziona come speravo (i dati si aggiornano senza visualizzare un messaggio Loading ...).
Y.later(1000/*ms*/, table.datasource, table.datasource.load, { request: query }, true);
Tuttavia, ho notato una perdita di memoria in Chrome. Le celle della tabella non sembrano essere rimosse dalla memoria. Il profilo di heap di Chrome riporta molti oggetti HTMLTableCellElement
in Detached DOM tree
.
È questo il metodo migliore per aggiornare i dati? In tal caso, c'è un modo per cancellare le vecchie celle del tavolo?
Alternative
C'è anche la datatable-polling
module che può fare il recupero periodico dei dati. Non riesco a nessun esempio di come questo dovrebbe essere usato con un YUI3 DataTable
. Tuttavia, examples from YUI2 spettacolo si può fare qualcosa la seguente, che sembra funzionare:
dataSource.setInterval(1000,
{
request: query,
callback:
{
success: function(e) { table.onDataReturnInitializeTable },
failure: function() { Y.log("Polling failure", "error"); }
}
});
Tuttavia, sembra che questo è proprio quello che 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);
}
},
Quindi, per confermare, 'load' dovrebbe essere responsabile della pulizia della memoria utilizzata dalle righe che vengono sostituite? – SimonC
In realtà, 'datatable.render' è responsabile di ciò, e quando si chiama' datatable.datasource.load', 'render' è chiamato sotto il cofano. Quindi sì. – juandopazo