2016-05-04 51 views
0

私は、Rails経由でデータベースからのデータを表示するHandsontableを作成しました。現在、表に99行あります。左端の「選択済み」列には、ユーザーが行を選択したかどうかを示す疑似チェックボックス(カスタムセルレンダラーを使用)が表示されます。データスキーマには、「選択された」プロパティも含まれます。ユーザーが1つまたは複数の列を選択すると、対応する行の「選択された」プロパティがデータオブジェクト内でトグルされ、変更されたセルが変更を反映するように再描画されます。Handsontable - 過剰なセルレンダリングでアプリケーションが遅くなる

編集可能な列に加えられた変更に対して、表示されているすべての「選択済み」セルが再描画されるという問題があります。デモを行うには、添付のjsFiddleで、左端の「選択済み」列と右端の「Prom」列の両方を編集できます。表の上のカウンタは、「選択された」セルレンダラが呼び出された回数を示します(簡略化のため、チェックボックスではなく「選択された」列にXが表示されます)。行1の「選択された」セルをクリックするだけで、selectColRendererが21回呼び出されることがわかります。同じセルをクリックして5行目(「選択済み」列に残っている)までドラッグすると、セルレンダラーが105回呼び出されます。 「Prom」列セルのいずれかにテキストを入力すると、セルレンダラへの21回の呼び出しも生成されます。

私のアプリケーションでは、データモデル内の99個のオブジェクトすべてを選択する「すべて選択」ボタンがあります。これらの行のうち28行が表示されている場合、selectColRendererは99 * 28回→ほぼ2800回のセルレンダラ呼び出しと呼ばれます。変更がブラウザに反映されるまでには3〜4秒かかります。

これは(簡体字)、セルレンダラー機能である:

var selectColRenderer = function(instance, td, row, col, prop, value, cellProperties) { 
    // the following 2 lines are only part of the fiddle 
    renderCount++; 
    $("#render_count").val(renderCount); 
    if (instance.getSourceDataAtRow(cellProperties.row).selected == true) { 
    $(td).html("X"); 
    } else { 
    $(td).html(""); 
    } 
}; 

そして、これは、データモデルを更新機能である:

afterSelectionEnd: function(r1, c1, r2, c2) { 
    hot = $("#list_table").handsontable("getInstance"); 
    if (c1 === 0 && c2 === 0) { 
    for (r = r1; r <= r2; r++) { 
     objRow = hot.getCellMeta(r, 0).row; 
     var selected = (hot.getSourceDataAtRow(objRow).selected) 
     hot.setDataAtRowProp(r, "selected", !selected); 
    } 
    } 
}, 

この動作を回避する方法はありますか?私が何百もの行を持つテーブルを持っていれば、パフォーマンスは受け入れられません。 Handsontableの仕組みですか、何か間違っていますか?

はフィドル:

答えて

1

https://jsfiddle.net/jplato/u9japmqg/は、多くの実験の後、私はこれを修正しました。複数の列を更新する最適な方法は、setDataAtRowProp()を使用せずに変更を個別に渡す代わりに、setDataAtCell()を使用して、各セルに変更の2D配列を渡すことです。

関連する問題