我想知道当用户在字段中设置值时是否有一个函数触发,但是如果字段中的程序设置值则没有。
所以功能:
user click on field 'myField and change value -> method fires up
in program : myField.setValue = SomeValue; -> method doesn't fires up.
问题在于循环检测。如果您的逻辑是您有4个字段并尝试检测是否有任何这些字段被更改,然后使用fire方法更改这些字段中的某些值:
@Override
protected void execChangedValue() throws ProcessingException {
super.execChangedValue();
valueFieldsChange(this);
}
protected void valueInPriceBoxFieldsChange(AbstractValueField field) {
... calculate some values in those fields....
}
我得到了:
!MESSAGE org.eclipse.scout.rt.client.ui.form.fields.AbstractValueField.setValue(AbstractValueField.java:338) Loop detection in...
所以我知道方法execChangedValue()
不是我想要的。有解释行为的类似方法吗?
Marko
答案 0 :(得分:1)
让我们开始说环路检测在90%的情况下都很有用。 当你在execChangedValue()中并且你试图更新同一个字段的值时会显示警告。
如果我理解你的例子,你就在你的领域内:
public class FirstField extends AbstractStringField {
@Override
protected void execChangedValue() throws ProcessingException {
calculateNewValues();
}
}
方法:
public void calculateNewValues() {
//some logic to compute the new values: value1, value2, value3
getFirstField().setValue(value1);
getSecondField().setValue(value2);
getThirdField().setValue(value3);
}
此时,您确实需要确保当用户将FirstField
中的值设置为某个内容时,您可能希望将其实际更改为其他内容。这可能会让用户感到困惑。
如果您确定需要更新该值,则可以设置值而不在字段上触发execChangedValue()。我在Eclipse Scout表单上提出了一个新方法:setValueWithoutChangedValueTrigger(T value):Controlling if execChangedValue() is called or not。
在论坛上,您会找到一个可以添加到字段中的代码段(或通用模板:AbstractMyAppStringField
)。
public class FirstField extends AbstractStringField {
@Override
protected void execChangedValue() throws ProcessingException {
calculateNewValues();
}
public void setValueWithoutValueChangeTrigger(String value) {
try {
setValueChangeTriggerEnabled(false);
setValue(value);
}
finally {
setValueChangeTriggerEnabled(true);
}
}
}
你将能够使用它:
public void calculateNewValues() {
//some logic to compute the new values: value1, value2, value3
getFirstField().setValueWithoutChangedValueTrigger(value1);
getSecondField().setValueWithoutChangedValueTrigger(value2);
getThirdField().setValueWithoutChangedValueTrigger(value3);
}
我希望这会有所帮助。