在 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 听众检查是否必须采取行动。
我有几个小部件用于控制 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 听众检查是否必须采取行动。