我有從遠程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);
}
},
所以,只是爲了確認,'load'應該負責清理被替換的行使用的內存? – SimonC 2013-05-09 01:54:45
實際上''datatable.render'是負責這個的,當你調用'datatable.datasource.load'時,'render'被調用。所以,是的。 – juandopazo 2013-05-13 13:34:41