在基于Vaadin 8的应用程序中,我想实现一个删除所有字段值的Command。我这样做使用Binder。当用户激活命令时,将创建一个新的Bean。
@Override public void menuSelected(MenuBar.MenuItem selectedItem) {
controller.createNewBean();
Page.getCurrent().reload();
}
我想向用户显示一个消息框,警告通过继续执行所有组件的所有值将丢失。我使用的是TabView,并且有相对较多的组件
我想仅在用户更改了至少一个组件的值时才显示此消息。
我想知道Vaadin是否有UI.getCurrent().isDirty()
或其他机制来确定用户是否为组件输入了新值?
感谢您的帮助
答案 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());
请确保在需要时(例如在保存时间)重置计数器。