Vaadin 19.0.6 Детали элемента сетки зависают при переходе к просмотру с помощью @UIScope

У меня есть представление с одиночной сеткой выбора, в котором есть настраиваемый рендеринг деталей элемента. View имеет аннотацию @UIScope.

Возникла проблема с открытием / закрытием деталей. Чтобы воспроизвести его, вы должны покинуть представление, а затем вернуться к нему (как бы то ни было. Перемещение с помощью кнопки возврата в браузере или с помощью маршрутизатора vaadin).

Первый случай, когда setDetailsVisibleOnClick (true), вы можете открыть или закрыть детали. Например, когда я в первый раз возвращаюсь назад, открывались подробности. Затем я повторяю переход от и до просмотра, и на этот раз детали были закрыты.

Второй случай, когда я установил setDetailsVisibleOnClick (false) и реализовал прослушиватель кликов с setDetailsVisible для элемента. Также я устанавливаю переменную selectedItem add, затем select (selectedItem) и setDetailsVisible (selectedItem, true) в методе onAttach. Теперь, когда я возвращаюсь к просмотру, элемент выбран и подробности открываются. Однако, когда я выбираю другой элемент, детали запоминаемого элемента остаются открытыми. Собственно, это верно и для первого случая с setDetailsVisibleOnClick (true). Если вы вернетесь к просмотру и подробности откроются, они останутся открытыми после того, как вы нажмете на другой элемент сетки.

   @Override
    public void onAttach(AttachEvent event) {
        //https://github.com/vaadin/vaadin-grid/issues/1850
        setDetailsVisibleOnClick(true);
        setDetailsVisibleOnClick(false);
        if (selectedItem != null) {
            select(selectedItem);
            if (detailsRenderer != null) setDetailsVisible(selectedItem, true);
            scrollToIndex(dataProvider.getItems().indexOf(selectedItem));
        }
    }

и SingleSelectionListener

event -> {
            var item = event.getSelectedItem().orElse(null);
            if (detailsRenderer != null) {
                var oldVal = event.getOldValue();
                if (selectedItem != null) setDetailsVisible(selectedItem, false);
                if (oldVal != null) setDetailsVisible(oldVal, false);
                if (item != null) setDetailsVisible(item, true);
                getElement().executeJs("this.notifyResize()");//preserve rows heights on grid container resize
            }
            selectedItem = event.getSelectedItem().orElse(null);
        }

person Ruslan    schedule 05.05.2021    source источник
comment
Не могли бы вы проверить этот тикет в системе отслеживания проблем Vaadin и сравнить, действительно ли основная причина вашей проблемы та же github.com/vaadin/vaadin-grid/issues/1850   -  person Tatu Lund    schedule 05.05.2021
comment
Нет, это другой вопрос. Я специально отметил обходной путь для проблемы 1850 в коде onAttach.   -  person Ruslan    schedule 05.05.2021


Ответы (1)


Мне удалось это обойти вот так. В моем расширенном классе Grid:

    public void restoreSavedSelection() {
        var items = dataProvider.getItems();
        if (selectedItem != null && !items.isEmpty() && items.contains(selectedItem)) {
            var index = items.indexOf(selectedItem);//workaround
            select(items.get(index));
            scrollToIndex(index);
        }
    }

    @Override
    public void scrollToIndex(int rowIndex) {
        getElement().executeJs("setTimeout(function() { $0.scrollToIndex($1) })", getElement(), rowIndex);
    }
person Ruslan    schedule 26.05.2021