Сбрасывать значения виджетов по умолчанию, не вызывая их слушателей изменения значений в веб-приложении Vaadin Flow 14 - PullRequest
0 голосов
/ 16 февраля 2020

У меня есть несколько виджетов для управления фильтрацией списка элементов в Grid. Каждый виджет имеет прослушиватель изменения значения, поэтому, когда пользователь использует один из виджетов, настраиваются фильтры на поставщике данных за Grid, в результате чего объект Grid отображает подмножество своих элементов.

    strength = new RadioButtonGroup <>();  // Backed with enum named `Strength`. 
    strength.setLabel( "Strength:" );
    strength.setItems( Strength.values() );
    strength.setValue( Strength.ANY );
    strength.setRenderer( new TextRenderer <>( Strength :: getDisplayName ) );
    strength.addValueChangeListener( event -> {
        configureFilters();
    } );

Это хорошо работает.

У меня также есть кнопка Сброс , чтобы вернуть элементам фильтра обратно в их состояние по умолчанию.

    reset = new Button( "Reset" );
    reset.addClickListener( event -> {
        this.resetCriteria();
        this.configureFilters();
    } );

Метод resetCriteria выполняет серию следующих вызовов:

this.strength.setValue( Strength.ANY );

Это вызывает проблемы. Сброс этих виджетов вызывает события изменения значения и слушает выполнение. Это прервало мою серию setValue( … ) звонков. Поэтому некоторые виджеты управления фильтром не сбрасываются.

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

Или я должен использовать совершенно другой подход к сбросу виджетов? Полагаю, я мог бы отказаться от всего макета виджетов и воссоздать его с нуля, но это кажется излишним, как будто должен быть более элегантный подход.

1 Ответ

4 голосов
/ 16 февраля 2020

Как и в Vaadin версии 8, существует способ определить, происходит ли событие (изменение значения) от пользователя или является «syntheti c» (генерируется кодом).

См. method com.vaadin.flow.component.ComponentEvent#isFromClient

Класс ComponentEvent<T extends Component>

public boolean isFromClient()

Проверяет, произошло ли это событие из на стороне клиента.

Возвращает:

true, если событие произошло со стороны клиента, false в противном случае

Таким образом, вы должны проверить свое значение смени слушателя, если данное событие isFromClient и делай только свою логи c тогда. Добавьте if ( event.isFromClient() ) к своему коду.

    strength.addValueChangeListener( event -> {
        if ( event.isFromClient() ) { this.configureFilters(); }
    } );

В противном случае (насколько мне известно) нет способов заставить слушателей замолчать, кроме как сделать это самостоятельно. Например,

  • Запомните Registration при регистрации каждого прослушивателя, закройте их до и снова добавьте прослушиватель после того, как вы закончите с изменением значений.
  • Создайте свой собственный переключатель убийств, чтобы слушатели могли проверить, нужно ли предпринимать какие-либо действия.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...