Vaadin:如何避免字段之间的级联值更改事件
Vaadin: how to avoid cascade valuechange events between fields
我在一个屏幕上有几个字段,它们通过验证规则部分地相互依赖。
如果用户更改了一个字段,那么我可以使用 setValue() 影响另一个字段。但是我正在解决这个问题,就像从用户 activity.
一样,从 setValue() 触发了 valueChange 事件
我的示例:我有四个字段 "activity_status"、"schedule_date"、"start_date"、"end_date"。通过编辑任何一个字段,我想影响另外三个字段(更改状态、设置或移动日期)。如何避免递归调用valueChange方法?
我可以想象一个可以用作锁的变量 justProcessedField,但是有没有人有更好的实践解决方案?
为避免 ValueChangeEvents,您可以创建自定义字段,这些字段是您要修改的字段的扩展。此自定义字段应具有调用 setInternalValue
方法的 public 方法。
复选框字段示例:
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();
}
}
通常我们会在触发第一个 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;
}
}
}
);
使用不同的布尔值,您还可以将字段分组 "sensisble/insensible" 以更改其他字段。
我在一个屏幕上有几个字段,它们通过验证规则部分地相互依赖。
如果用户更改了一个字段,那么我可以使用 setValue() 影响另一个字段。但是我正在解决这个问题,就像从用户 activity.
一样,从 setValue() 触发了 valueChange 事件
我的示例:我有四个字段 "activity_status"、"schedule_date"、"start_date"、"end_date"。通过编辑任何一个字段,我想影响另外三个字段(更改状态、设置或移动日期)。如何避免递归调用valueChange方法?
我可以想象一个可以用作锁的变量 justProcessedField,但是有没有人有更好的实践解决方案?
为避免 ValueChangeEvents,您可以创建自定义字段,这些字段是您要修改的字段的扩展。此自定义字段应具有调用 setInternalValue
方法的 public 方法。
复选框字段示例:
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();
}
}
通常我们会在触发第一个 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;
}
}
}
);
使用不同的布尔值,您还可以将字段分组 "sensisble/insensible" 以更改其他字段。