2013-05-03 10 views
5

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

Odpowiedz

0

datasource-polling nie pomoże w tym przypadku ponieważ Plugin.DataTableDataSource nie powoduje, że DataTable nasłuchuje wszystkich zmian w DataSource. Najprostszym sposobem odpytywania przy użyciu Plugin.DataTableDataSource byłoby ustawić interwał siebie tak:

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(); 

Przeciek pamięci należy wspomnieć jest możliwość. DataTable jest w ciągłym rozwoju i będzie lepiej zarządzać pamięcią. Jednakże, jeśli masz powtarzalne przypadki i dokładne pomiary, powinieneś zdecydowanie open an issue w repozytorium YUI's GitHub.

+0

Tak więc, aby potwierdzić, 'load' powinno być odpowiedzialne za wyczyszczenie pamięci używanej przez wiersze, które są wymieniane? – SimonC

+0

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

Powiązane problemy