在我目前的项目中,我必须处理更复杂的表格。如果特定字段(我将其命名为“C”)接收到用户输入,则字段(我将其命名为“A”和“B”)将自动填充。但是,如果用户将数据输入到字段A中,则字段B和C将自动填写。
(这只是一个简单的例子,当前的逻辑有点复杂)
我需要注意的是没有发生循环(C - > A - > C - > A - > ...)。所以我现在需要,如果当前值的变化是由于用户输入或另一个已接收输入的字段,然后触发了当前字段的值更改。而且我现在还需要在第二种情况下哪个字段确切地触发了值的变化,因为那时我必须触发与触发该值变化的人/什么相对应的其他特定操作。
答案 0 :(得分:3)
处理Vaadin中的valueChange事件有点痛苦,因为它总是触发,无论用户是否更改了某些内容,或者应用程序在组件上使用了setValue(....)。
唯一的解决方案是记住何时在应用程序中执行setValue(....),然后禁用其他组件中的触发器代码。
例如在这种情况下(无限循环):
field1.addValueChangeListener( field2.setValue('Updated by field1');
field2.addValueChangeListener( field1.setValue('Updated by field2');
以这种方式改变:
boolean inTrigger= false;
field1.addValueChangeListener(
{
if (!inTrigger)
{
inTrigger= true;
field2.setValue('Updated by field1');
inTrigger= false;
}
});
field2.addValueChangeListener(
{
if (!inTrigger)
{
inTrigger= true;
field1.setValue('Updated by field2');
inTrigger= false;
}
});
这样你就可以阻止更新循环,让你只执行一次代码。