SlickGrid onSelectedRowsChange запускает дважды, когда выбрано более одной строки?
(смотрите этот вопрос и этот вопрос для фона...)
Дано:
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 ответ:
Проблема (которую я с тех пор обнаружил) заключается в модели выбора строк
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 мастер", как сказал @fbuchinger, и я знаю, что это исправление быстро и грязно (это нарушает навигацию по клавиатуре и выбор между строками), но оно работает и дает мне ожидаемое поведение, описанное в моем вопросе. Поскольку я больше забочусь о том, чтобы щелчки работали правильно, чем навигация по клавиатуре, я придерживаюсь этого сейчас.
Кто-нибудь знает лучший способ?