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 に答える