2013-05-03 46 views
5

我有從遠程JSON DataSource填充的DataTable內存泄漏與數據表和DataSource與輪詢

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

我試圖在週期性地刷新該表中的數據。 A forum poster recommended calling load periodically,我試過了,它按照我所希望的那樣工作(數據刷新時不顯示Loading ...消息)。

Y.later(1000/*ms*/, table.datasource, table.datasource.load, { request: query }, true); 

但是,我注意到Chrome中的內存泄漏。表格單元似乎不會從內存中移除。 Chrome的堆分析器在Detached DOM tree中報告了大量HTMLTableCellElement對象。

這是刷新數據的最佳方法嗎?如果是這樣,有沒有辦法清除舊的表格單元格?

替代

也有datatable-polling module,可以做數據的定期抓取。儘管如此,我無法舉例說明如何使用YUI3 DataTable。然而,examples from YUI2告訴你可以做下面的內容,這似乎工作:

dataSource.setInterval(1000,   
    { 
     request: query, 
     callback: 
      { 
       success: function(e) { table.onDataReturnInitializeTable }, 
       failure: function() { Y.log("Polling failure", "error"); } 
      } 
    }); 

然而,看起來這正是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); 
    } 
}, 

回答

0

datasource-polling不會幫助你在這種情況下,因爲Plugin.DataTableDataSource不會使DataTable監聽DataSource中的所有更改。使用Plugin.DataTableDataSource投票的最簡單的辦法是建立自己的間隔是這樣的:

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

你提到的內存泄漏的可能性。 DataTable正在進行中,它將更好地管理內存。但是,如果你有一個可重複的案例和全面的測量結果,你應該在YUI的GitHub倉庫中確定open an issue

+0

所以,只是爲了確認,'load'應該負責清理被替換的行使用的內存? – SimonC 2013-05-09 01:54:45

+0

實際上''datatable.render'是負責這個的,當你調用'datatable.datasource.load'時,'render'被調用。所以,是的。 – juandopazo 2013-05-13 13:34:41