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

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

[4]

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

[2]
[4, 2]

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

[16]
[4, 2, 16]

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

为什么是这样?我只希望它被触发一次,给我所选行的完整数组。我将如何做到这一点?还是我错过了什么?

4

1 回答 1

3

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

Specifically, when the row was selected, handleActiveCellChange()AND handleClick()were being called, each which calls setSelectedRanges(), while the former only sets it to the currently clicked row, and the latter sets it to all the selected rows.

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

   ...

}

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

有人知道更好的方法吗?

于 2011-05-30T18:01:57.900 回答