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 6

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, и я знаю, что это исправление быстро и грязно (это нарушает навигацию по клавиатуре и выбор между строками), но оно работает и дает мне ожидаемое поведение, описанное в моем вопросе. Поскольку я больше забочусь о том, чтобы щелчки работали правильно, чем навигация по клавиатуре, я придерживаюсь этого сейчас.

Кто-нибудь знает лучший способ?