【问题标题】:Eclipse Scout callback for entering value in fields用于在字段中输入值的 Eclipse Scout 回调
【发布时间】:2015-01-23 07:34:11
【问题描述】:

我想知道当用户在字段中设置值时是否有一个函数会触发,但如果程序在字段中设置值则不会。

函数:

user click on field 'myField and change value -> method fires up
in program : myField.setValue = SomeValue; -> method doesn't fires up.

问题在于循环检测。如果您的逻辑是您有 4 个字段并尝试检测这些字段中的任何一个是否已更改,然后触发更改这些字段中某些值的方法:

@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() 方法不是我想要的。有没有类似的解释行为的方法?

马尔科

【问题讨论】:

    标签: infinite-loop eclipse-scout


    【解决方案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 Form 上的 setValueWithoutChangedValueTrigger(T value):Controlling if execChangedValue() is called or not

    在论坛上,您会找到一个可以添加到您的字段中的 sn-p(或在通用模板中: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);
    }
    

    我希望这会有所帮助。

    【讨论】:

    • 这很好,但我想在 FormData 中使用这个函数。如果我在 scout 服务器中设置表单数据并将其导入 scout,我想导入使用此功能。这可能吗?
    猜你喜欢
    • 1970-01-01
    • 2016-06-13
    • 1970-01-01
    • 2021-03-13
    • 2016-07-09
    • 2021-10-08
    • 2016-07-14
    • 2012-05-06
    • 1970-01-01
    相关资源
    最近更新 更多