5

我有一个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 的堆分析器HTMLTableCellElementDetached 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);
    }
},
4

1 回答 1

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 存储库中打开一个问题。

于 2013-05-08T17:38:46.400 回答