我在屏幕上有几个字段,它们通过验证规则部分依赖于其他字段。
如果用户更改了一个字段,那么我可以使用setValue()影响另一个字段。但我正在解决这个问题,valueChange事件是从setValue()触发的,就像用户活动一样。
我的例子:我有四个字段“activity_status”,“schedule_date”,“start_date”,“end_date”。通过编辑任何一个字段,我想影响另外三个字段(更改状态,设置或更改日期)。如何避免递归调用valueChange方法?
我可以想象一个变量justProcessedField可以作为一个锁,但是有没有更好的动手解决方案?
答案 0 :(得分:1)
通常我们在触发第一个valueChangeEvent()时设置一个标志,然后忽略所有其他标志,直到第一个触发器完成处理。
伪代码如下所示:
private boolean _ignoreTriggers= false; // Set ignore triggers when we do manual setValue stuff
field1.addListener(new ValueChangeListener() {
@Override
public void valueChange(ValueChangeEvent event) {
if (!_ignoreTriggers) {
_ignoreTriggers= true;
// Do the processing and setValues(...) in the other fields
_ignoreTriggers= false;
}
}
}
);
使用不同的布尔值,您还可以对其他字段中的更改进行“敏感/不敏感”字段组。
答案 1 :(得分:0)
要避免使用ValueChangeEvents,您可以创建自定义字段,这些字段是您要修改的字段的扩展名。此自定义字段应具有调用setInternalValue
方法的公共方法。
Checkbox-Field示例:
public class CheckBoxSilent extends CheckBox {
/**
* Set the new value without calling a {@link ValueChangeListener}
*
* @param newValue the new value to be set.
*/
public void setValueSecretly(boolean newValue) {
setInternalValue(newValue);
markAsDirty();
}
}