Java Vaadin流恢复/撤消值更改,无需再次触发侦听器

Java Vaadin流恢复/撤消值更改,无需再次触发侦听器,java,vaadin,vaadin-flow,Java,Vaadin,Vaadin Flow,使用Vaadin 18 我在一个组合框上有一个值更改侦听器,它打开一个确认对话框,允许用户确认更改。因为这在值更改侦听器中,所以该值在技术上已经更改。因此,当他们选择“否”时,我需要还原该值。除了手动设置值外,API中似乎没有任何部分可以做到这一点 但是当通过设置值恢复时。。。侦听器再次触发。我需要防止它再次开火。目前,我唯一能做到这一点的方法是使用一个额外的ignoreNextChange布尔变量,它可以防止逻辑再次运行。有没有更简单的方法?无论如何,我看不到添加在值更改之前触发的侦听器 我不

使用Vaadin 18

我在一个组合框上有一个值更改侦听器,它打开一个确认对话框,允许用户确认更改。因为这在值更改侦听器中,所以该值在技术上已经更改。因此,当他们选择“否”时,我需要还原该值。除了手动设置值外,API中似乎没有任何部分可以做到这一点

但是当通过设置值恢复时。。。侦听器再次触发。我需要防止它再次开火。目前,我唯一能做到这一点的方法是使用一个额外的ignoreNextChange布尔变量,它可以防止逻辑再次运行。有没有更简单的方法?无论如何,我看不到添加在值更改之前触发的侦听器


我不能简单地忽略所有非客户端的更改,因为这会破坏绑定。而且,从侦听器内部更改侦听器注册将不起作用,因为我还需要将其添加回去,这将导致它无论如何都会触发。

您正确地假设,您无法阻止 在值更改处理程序中的更改发生在事件发生之后

你的主要选择是:

您只对客户的人为更改做出反应。看见

或者将UI与操作分离,为用户提供一些UI以请求 改变,再问一次,然后做改变——这可以通过一些方法来完成 方式。一种方法是编写自己的字段包装组合 框并仅在确认选择后触发更改


你的假设是正确的,你不能阻止病毒的传播 在值更改处理程序中的更改发生在事件发生之后

你的主要选择是:

您只对客户的人为更改做出反应。看见

或者将UI与操作分离,为用户提供一些UI以请求 改变,再问一次,然后做改变——这可以通过一些方法来完成 方式。一种方法是编写自己的字段包装组合 框并仅在确认选择后触发更改


我想你用的是无缓冲的活页夹,有活页夹.setBean?这有一个基本假设,即每次写入都直接发生在字段值更改之后,而不是在确认步骤之后。如果要延迟写入缓冲绑定,则应在准备就绪后使用binder.WriteBean。请注意,这应该在不调用setBean的情况下完成。

我假设您使用的是无缓冲的活页夹,与Binder.setBean一起使用?这有一个基本假设,即每次写入都直接发生在字段值更改之后,而不是在确认步骤之后。如果要延迟写入缓冲绑定,则应在准备就绪后使用binder.WriteBean。请注意,这应该在不调用setBean的情况下完成。

这两种方法都可以工作,但目前我需要的代码最少的解决方案是我在问题中提到的-使用布尔值忽略下一个更改事件。在不知道确切情况的情况下,这听起来像是另一个需要跟踪的状态层,否则将来它会在背后刺伤你。忽略用户对话框的更改处理程序中的合成更改会更安全。不过这只是直觉。这两种方法都很有效,但目前我需要的代码最少的解决方案就是我在问题中提到的——使用布尔值忽略下一个更改事件。在不知道具体情况的情况下,这听起来像是另一个需要跟踪的状态层,否则将来它会在背后刺伤你。忽略用户对话框的更改处理程序中的合成更改会更安全。不过这只是一种直觉。它与bean更改中的值无关,我试图阻止字段的实际值更改。我想你想要的UI行为听起来更适合缓冲绑定,这是我想说的。它与bean更改中的值无关,我试图阻止字段的实际值发生变化。我认为您想要的UI行为听起来更适合缓冲绑定,这就是我要说的。