Неизвестный ключ в сетке Ваадин 14 во время выбора - PullRequest
0 голосов
/ 26 мая 2020

Я использую Grid в Vaadin 14. Сетка находится в режиме множественного выбора. Обработчик выбора занимает пару секунд, и я вызываю setItems(...) в конце, чтобы обновить элементы в сетке.

Когда пользователь выбирает другую строку, в то время как предыдущий обработчик выбора все еще работает, Я получаю ошибку «Неизвестный ключ», аналогичную описанной в https://github.com/vaadin/vaadin-grid-flow/issues/322, хотя новый набор элементов по-прежнему содержит выбранный элемент (другой экземпляр объекта, но такой же, как в equals()). Похоже, это связано с тем, что ключи в KeyMapper уже были изменены из-за setItems(), поэтому ключ, исходящий от клиента, больше не присутствует.

Есть ли способ обойти это, для Например, отключив выбор во время выполнения предыдущего запроса?

ОБНОВЛЕНИЕ

Чтобы обойти эту ошибку Vaadin , я также звоню setPageSize() с точным количеством элементов в качестве аргумента. Но похоже, что та же проблема возникает, даже если я не звоню setPageSize(), так что, вероятно, это связано с setItems().

1 Ответ

0 голосов
/ 26 мая 2020

Не не изменять элементы сетки внутри SelectionListener. Вы по-прежнему можете делать все, что хотели, но заново настраивать элементы не требуется. Фактически, это создаст только проблемы, с которыми вы столкнулись сейчас.

Работая над этим ответом, я понял, что вам нужно будет создать свой собственный столбец флажков, чтобы иметь возможность выполнять действия для одного элемента, который был просто «выбрано», вместо того, чтобы удалить все, добавить все выбранные (потому что производительность намного выше). Вот как это может выглядеть.

// in my code samples, a `Foo` item can have many `Bar` items. The grid is of type Bar.

Grid.Column customSelectionColumn = grid.addComponentColumn(item -> {
    Checkbox isSelected = new Checkbox();
    isSelected.setValue(someParentFoo.getBars().contains(item));
    isSelected.addValueChangeListener(event -> {
        boolean newSelectedValue = event.getValue();
        if(newSelectedValue){
            someParentFoo.getBars().add(item)
        } else {
            someParentFoo.getBars().remove(item);
        } 
        fooRepository.save(someParentFoo);
    });
});
// make a Checkbox that selects all in the header
Checkbox toggleSelectAll = new Checkbox();
toggleSelectAll.addValueChangeListener(event -> {
    if(event.getValue()){
        someParentFoo.getBars().addAll(allGridItems);
    } else {
        someParentFoo.getBars().removeAll(allGridItems);
    }
    fooRepository.save(someParentFoo);
    grid.getDataProvider().refreshAll(); // updates custom checkbox value of each item
});
gridHeaderRow.getCell(customSelectionColumn).setComponent(toggleSelectAll);
...