【问题标题】:How to determine if a component in UI has been Updated in Vaadin 8如何确定 UI 中的组件是否已在 Vaadin 8 中更新
【发布时间】:2017-06-13 14:36:04
【问题描述】:

在基于 Vaadin 8 的应用程序中,我想实现一个删除所有字段值的命令。我已经使用 Binder 完成了这项工作。当用户激活命令时,将创建一个新的 Bean。

    @Override public void menuSelected(MenuBar.MenuItem selectedItem) {

    controller.createNewBean();
    Page.getCurrent().reload();

}

我想向用户显示一个消息框,警告通过继续操作,所有组件的所有值都将丢失。我使用的是 TabView,组件比较多。
仅当用户更改了至少一个组件的值时,我才想显示此消息。 我想知道 Vaadin 是否有类似 UI.getCurrent().isDirty() 或其他机制来确定用户是否向组件输入了新值?

感谢帮助

【问题讨论】:

    标签: java web-applications vaadin vaadin4spring vaadin8


    【解决方案1】:

    我发现最有效的方法是向绑定器注册一个新的侦听器,以便在组件值发生任何变化时得到通知。

    在这个监听器中,我使用了一个原子整数,每次更改都会递增。 稍后,使用这个原子整数,我决定是否有任何字段被用户触摸过。

    并非如此,这不会检测更改,但会检测修改(例如,用户可能多次更改字段值但最终将值设置为原始值)。

    AtomicInteger counter = new AtomicInteger();
    binder.addValueChangeListener((HasValue.ValueChangeListener<Object>) event -> counter.incrementAndGet());
    

    确保在需要时重置计数器(例如在保存时间)。

    【讨论】:

    • 优雅的解决方案!对于 Vaadin 14.1.23,泛型部分略有不同(至少与我的 Eclipse 接受的不同): binder.addValueChangeListener((HasValue.ValueChangeListener super ValueChangeEvent>>) event -> counter.incrementAndGet());跨度>
    【解决方案2】:

    您可能想使用binder.hasChanges()。这基本上检查您的字段和绑定到字段的底层 bean 是否因用户交互而不同。

    来自 Vaadin 的文档:

    检查自上次显式调用 setBean(Object)、readBean(Object)、removeBean()、writeBean(Object) 或 writeBeanIfValid(Object) 以来是否有任何绑定字段的值发生了变化。

    有关详细信息,请参阅 Vaadin's API 和 Vaadin Doc 的章节 Binding Data to Forms

    使用Page.getCurrent().reload(),您将获得一个新的用户界面,并且您的所有组件都将重置,就像您打开了一个新标签一样。对于重置您的组件,我建议使用binder.readBean(theNewBeanWithFreshValues)。这会将绑定字段的值设置回 bean 的值。

    【讨论】:

    • 感谢@Axel Meier。似乎唯一的方法是 binder.hasChanges()。问题是我有不同的 Bean 和不同的选项卡,我必须知道许多活页夹。因此,我也使用 reload 而不是 readBrean。
    • 我用 binder hasChanges 测试了实现。它不像文档中描述的那样工作。看到这个:vaadin.com/forum/#!/thread/14906891/15007809
    • @Govan 感谢您的反馈。事实上hasChanges()readBean()writeBean() 结合使用更有意义。使用setBean() 会自动提交更改hasChanges() 将返回false。同样使用setBean(),无法再恢复旧值。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-17
    • 2021-07-08
    • 2019-05-29
    • 1970-01-01
    • 2015-06-07
    相关资源
    最近更新 更多