如何确定UI中的组件是否已在Vaadin 8中更新

时间:2017-06-13 14:36:04

标签: java web-applications vaadin vaadin4spring vaadin8

在基于Vaadin 8的应用程序中,我想实现一个删除所有字段值的Command。我这样做使用Binder。当用户激活命令时,将创建一个新的Bean。

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

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

}

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

感谢您的帮助

2 个答案:

答案 0 :(得分:0)

您可能想要使用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的值。

答案 1 :(得分:0)

我发现最有效的方法是向活页夹注册一个新的侦听器,以获取有关组件值的任何更改的通知。

在此侦听器中,我使用一个原子整数,每次更改都会增加一个原子整数。 稍后,使用这个原子整数,我确定用户是否触摸过任何字段。

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

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

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