2013-05-03 11 views
5

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); 
    } 
}, 

risposta

0

datasource-polling non vi aiuterà in questo caso poiché Plugin.DataTableDataSource non consente a DataTable di ascoltare tutte le modifiche in DataSource. Il modo più semplice di polling usando Plugin.DataTableDataSource sarebbe quella di impostare l'intervallo di soli come questo:

var datasource = new Y.DataSource.IO(...); 
var table = new Y.DataTable(...); 

table.plug(Y.Plugin.DataTableDataSource, { 
    datasource: datasource 
}); 

// call load() every second 
var timer = Y.later(1000, table.datasource, 'load', { 
    request: foo 
}, true); 

// later on, stop polling 
timer.cancel(); 

La perdita di memoria si parla è una possibilità. DataTable è in fase di sviluppo e migliorerà la gestione della memoria. Tuttavia, se si dispone di un caso riproducibile e di misurazioni approfondite, si dovrebbe assolutamente open an issue nel repository GitHub di YUI.

+0

Quindi, per confermare, 'load' dovrebbe essere responsabile della pulizia della memoria utilizzata dalle righe che vengono sostituite? – SimonC

+0

In realtà, 'datatable.render' è responsabile di ciò, e quando si chiama' datatable.datasource.load', 'render' è chiamato sotto il cofano. Quindi sì. – juandopazo