我有一个DataTable
从远程 JSON 填充的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 });
我正在尝试定期刷新表中的数据。 一位论坛发帖人建议定期调用 load,我已经尝试过,它可以按我希望的方式工作(数据刷新而不显示 Loading... 消息)。
Y.later(1000/*ms*/, table.datasource, table.datasource.load, { request: query }, true);
但是,我注意到 Chrome 中存在内存泄漏。表格单元格似乎没有从内存中删除。Chrome 的堆分析器HTMLTableCellElement
在Detached DOM tree
.
这是刷新数据的最佳方法吗?如果是这样,有没有办法清除旧的表格单元格?
备择方案
还有可以定期获取数据的datatable-polling
模块。不过,我无法举例说明这应该如何与 YUI3 一起使用DataTable
。但是,来自 YUI2 的示例显示您可以执行以下操作,这似乎有效:
dataSource.setInterval(1000,
{
request: query,
callback:
{
success: function(e) { table.onDataReturnInitializeTable },
failure: function() { Y.log("Polling failure", "error"); }
}
});
load
但是,无论如何,这似乎就是幕后所做的:
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);
}
},