(有关背景,请参阅this question和this 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
被触发两次:一次是针对新点击的行,一次针对所有选定的行。
这是为什么?我只希望它解雇 一次 ,为我提供所选行的完整数组。我怎么做到这一点?或者我错过了什么?
答案 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所说的那样,我知道这个修复很快而且很脏(这打破了键盘导航和行之间的选择),但是它有效并给了我在我的问题中描述的预期行为。由于我比键盘导航更关心点击工作,我现在坚持这个。
有人知道更好的方法吗?