0

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

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

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

}

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

感谢帮助

4

2 回答 2

1

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

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

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

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

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

于 2019-03-22T21:59:37.707 回答
0

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

来自 Vaadin 的文档:

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

有关详细信息,请参阅Vaadin 的 API和 Vaadin Doc 的将数据绑定到表单一章。

随着Page.getCurrent().reload()您获得一个新的 UI,您的所有组件都将被重置,就好像您打开了一个新选项卡一样。对于重置您的组件,我建议使用binder.readBean(theNewBeanWithFreshValues). 这会将绑定字段的值设置回 bean 的值。

于 2017-06-13T15:23:56.110 回答