在 Vaadin Flow 14 网络应用程序中重置小部件的默认值而不触发它们的值更改侦听器

Reset default values of widgets without triggering their value-change listeners in Vaadin Flow 14 web app

我有几个小部件用于控制 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( … ) 电话。所以一些过滤器控件小部件没有重置。

➥ 在我将所有小部件值重置为默认值的短暂间歇期间,有没有一种方法可以暂停值更改事件的触发或监听器的监听?

或者我应该采用完全不同的方法来重置小部件吗?我想我可以丢弃小部件的整个布局并从头开始重新创建,但这似乎有点矫枉过正,好像应该有更优雅的方法。

与 Vaadin 版本 8 一样,有一种方法可以确定(值更改)事件是来自用户还是“合成”事件(由代码生成)。

方法见com.vaadin.flow.component.ComponentEvent#isFromClient

Class ComponentEvent<T extends Component>

public boolean isFromClient()

Checks if this event originated from the client side.

Returns:

true if the event originated from the client side, false otherwise

因此,如果给定事件发生,您将检查您的值更改侦听器 isFromClient 然后只做你的逻辑。将 if ( event.isFromClient() ) 添加到您的代码中。

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

否则(据我所知)没有办法让听众沉默 除了自己做。例如

  • 记住 Registration 注册每个侦听器,之前关闭它们,并在完成更改值后重新添加侦听器。
  • 建立你自己的 killswitch 听众检查是否必须采取行动。