当选择多行时,SlickGrid onSelectedRowsChange触发两次?

nee*_*zer 6 jquery slickgrid

(有关背景,请参阅此问题此问题 ...)

鉴于:

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);
});
Run Code Online (Sandbox Code Playgroud)

...当我选择一行(比如第5行)时,我得到一个输出

[4]
Run Code Online (Sandbox Code Playgroud)

......这就是我所期待的.但是,CMD + Click或SHIFT + Click -ing除了这一行之外的另一行(比如第3行)给了我一个输出

[2]
[4, 2]
Run Code Online (Sandbox Code Playgroud)

......这不是我所期望的(我期待的是[4, 2]).只要选择的行数是这样的,这似乎就会发生> 1.所以,如果我要继续选择另一行(比如第17行),我会得到这个

[16]
[4, 2, 16]
Run Code Online (Sandbox Code Playgroud)

我在console.log语句中添加了一个断点,并验证了onSelectedRowsChanged它被触发了两次:一次是针对新单击的行,一次是针对所有选定的行.

为什么是这样?我只希望它被触发一次,给我完整的所选行数组.我怎么做到这一点?或者我错过了什么?

nee*_*zer 3

问题(我后来发现)在于行选择模型Slick.RowSelectionModel()

具体来说,当选择该行时,会调用handleActiveCellChange()AND ,每个调用,而前者仅将其设置为当前单击的行,后者将其设置为所有选定的行。handleClick()setSelectedRanges()

我通过在init()(内部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;
   }

   ...

}
Run Code Online (Sandbox Code Playgroud)

我不知道作者是否已在“v2 master”中修复了这个问题,正如 @fbuchinger 所说,我知道这个修复是快速且肮脏的(这会破坏键盘导航和行之间的选择),但它有效并给了我我的问题中描述的预期行为。由于我更关心点击是否正常工作而不是键盘导航,所以我现在坚持这一点。

有人知道更好的方法吗?