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

时间:2011-01-19 15:21:33

标签: jquery slickgrid

(有关背景,请参阅this questionthis question。)

假设:

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);
});

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

的输出
[4]

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

[2]
[4, 2]

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

[16]
[4, 2, 16]

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

这是为什么?我只希望它解雇 一次 ,为我提供所选行的完整数组。我怎么做到这一点?或者我错过了什么?

1 个答案:

答案 0 :(得分:3)

问题(我已经发现)存在于行选择模型Slick.RowSelectionModel()中。

具体来说,当选择行时,调用handleActiveCellChange()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;
   }

   ...

}

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

有人知道更好的方法吗?