【问题标题】:Vaadin: how to avoid cascade valuechange events between fieldsVaadin:如何避免字段之间的级联值更改事件
【发布时间】:2015-03-10 15:44:20
【问题描述】:

我在屏幕中有几个字段,它们通过验证规则部分地相互依赖。
如果用户更改了一个字段,那么我可以使用 setValue() 影响另一个字段。但我正在与这个问题作斗争,valueChange 事件是从 setValue() 触发的,就像从用户活动中一样。

我的例子:我有四个字段“activity_status”、“schedule_date”、“start_date”、“end_date”。通过编辑任何一个字段,我想影响另外三个字段(更改状态、设置或更改日期)。如何避免递归调用 valueChange 方法?

我可以想象一个变量 justProcessedField 可以用作锁,但有没有更好的动手解决方案?

【问题讨论】:

  • 这也是我们所做的。我们有一个持有标志“insideValuechangeEvent”的“全局”变量。在每个事件监听器中,我们首先检查是否设置了该标志。设置后,不做任何事情,否则设置标志并更新其他字段,然后清除标志 agin
  • 好的,我昨天做了类似的事情。如果你把它写成答案,我会接受它。

标签: events recursion field vaadin onchange


【解决方案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;
            }
        }
    }
);

使用不同的布尔值,您还可以使字段组对其他字段的更改“敏感/不敏感”。

【讨论】:

    【解决方案2】:

    要避免 ValueChangeEvents,您可以创建自定义字段,这些字段是您要修改的字段的扩展。这个自定义字段应该有一个调用setInternalValue 方法的公共方法。

    复选框字段示例:

    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();
        }
    }
    

    【讨论】:

    • 我理解但是继承所有字段类型然后在所有java源中替换它们非常费力。对于这个解决方案,我们必须等到有人来修改 AbstractField。
    • 在 vaadin bugtracker 中是否为此打开了错误/增强请求?
    猜你喜欢
    • 1970-01-01
    • 2017-10-07
    • 1970-01-01
    • 2017-01-17
    • 2012-06-08
    • 2021-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多