2

問題の概要は次のとおりです。列の sortChange() リスナーをセットアップしました。このリスナーは、並べ替えの変更に応答してクエリを起動し、新しく並べ替えられたデータをフェッチします。フェッチ前にグリッドの状態を保存し、フェッチ後にグリッドの状態を復元します。問題は、gridState の復元メカニズムが元の並べ替えリスナーをトリガーし、プロセス全体が何度も何度も何度も繰り返されることです。

scope.sitesGrid.onRegisterApi = function(gridApi) {
  scope.gridApi = gridApi;

  scope.gridApi.core.on.sortChanged(scope, function () {
    // load new sites on a sort change
    scope.initialize();
  });
};

scope.initialize = function() {
  // save current grid state
  scope.gridApi && (scope.gridState = scope.gridApi.saveState.save());

  fetchSites().then(function (sites) {
    scope.sitesGrid.data = sites
    // restore current grid state, but inadvertently retrigger the 'sortChanged' listener
    scope.gridApi.saveState.restore(scope,scope.gridState);
  })
};

sortChange リスナーを使用する代わりに、各列ヘッダーにクリック リスナーを設定できると考えていましたが、この解決策は見苦しく、すべてのヘッダー セル テンプレートに移動して変更を加える必要があります。

4

2 に答える 2

1

データのロードを追跡するためのある種のスコープ変数はどうですか?

scope.gridApi.core.on.sortChanged(scope, function () {
    if (!scope.isLoading) {
        scope.initialize();
    }
});

fetchSites().then(function (sites) {
    scope.isLoading = true;
    scope.sitesGrid.data = sites;
    scope.gridApi.saveState.restore(scope,scope.gridState);
    scope.isLoading = false;
})

timeout()これにタイミングの問題がある場合は、場所にいくつかの呼び出しを追加する必要がある場合があります。その場合、これを実証するために Plunker を作成すると役立ちます。

于 2016-09-20T02:41:53.900 に答える