6

(背景については、この質問この質問を参照してください...)

与えられた:

grid = new Slick.Grid("#myGrid", data, columns, options);
grid.setSelectionModel(new Slick.RowSelectionModel());
grid.onSelectedRowsChanged.subscribe(function() { 
   row_ids = grid.getSelectedRows();
   console.log(row_ids);
});

... 1 つの行 (たとえば、行 5) を選択すると、次の出力が得られます。

[4]

...これは私が期待するものです。ただし、この行に加えて別の行 (たとえば、行 3) を CMD + クリックまたは SHIFT + クリックすると、次のような出力が得られます。

[2]
[4, 2]

...これは私が期待するものではありません(私はただ期待します[4, 2])。これは、選択された行数が である限り発生するようです> 1。したがって、別の行 (たとえば、行 17) を選択し続けると、次のようになります。

[16]
[4, 2, 16]

console.logステートメントにブレークポイントを追加し、onSelectedRowsChangedが 2 回起動されていることを確認しました。1 回は新しくクリックされた行に対して、もう 1 回は選択されたすべての行に対してです。

どうしてこれなの?一度だけ起動して、選択した行の完全な配列を取得します。どうすればこれを達成できますか? または、何か不足していますか?

4

1 に答える 1

3

問題(私はそれ以来発見しました)は行選択モデルにありSlick.RowSelectionModel()ます。

具体的には、行が選択されたときにhandleActiveCellChange()ANDhandleClick()が呼び出され、それぞれがを呼び出しますがsetSelectedRanges()、前者は現在クリックされている行にのみ設定し、後者は選択されたすべての行に設定します。

init()(inside slick.rowSelectionModel.js_grid.onActiveCellChangedハンドラーで登録を解除し、呼び出しを内部に移動することでこれを修正しましたhandleClick()

function init(grid) {
   _options = $.extend(true, {}, _defaults, options);
   _grid = grid;
   // _grid.onActiveCellChanged.subscribe(handleActiveCellChange);
   _grid.onKeyDown.subscribe(handleKeyDown);
   _grid.onClick.subscribe(handleClick);
}

...

function handleClick(e, data) {

   ...

   if (!e.ctrlKey && !e.shiftKey && !e.metaKey) {
      handleActiveCellChange(e, data);
      return false;
   }

   ...

}

@fbuchingerが言ったように、これが「v2マスター」で作成者によって修正されたかどうかはわかりません。この修正は迅速で汚いです(これにより、キーボードナビゲーションと行間の選択が壊れます)が、機能し、私に与えてくれます。私の質問で説明されている予想される動作。私はキーボードナビゲーションよりもクリックが適切に機能することを重視しているので、今のところこれに固執しています。

誰かがより良い方法を知っていますか?

于 2011-05-30T18:01:57.900 に答える