【问题标题】:Remove value change listener删除值更改侦听器
【发布时间】:2015-08-06 05:58:51
【问题描述】:

我在值变化监听器方面遇到问题。

我在具有六个复选框的 vaadin 选项组中添加了值更改侦听器。

optionGroup.addValueChangeListener(this :: optionGroupValueChanged);
//..
private void optionGroupValueChanged(ValueChangeEvent valueChangeEvent) {
 //...
}

现在我有另一个复选框,它选择选项组的所有复选框(因为它是多选)。我想避免为单个复选框调用值更改侦听器,因此我首先删除了值更改侦听器并在选择全部后添加,如下所述。

selectAllCheckBox.addValueChangeListener(this :: selectAllChecked);
//...
private void selectAllChecked(ValueChangeEvent valueChangeEvent) {
    final boolean isChecked = (boolean) valueChangeEvent.getProperty().getValue();
    //Following line does not remove the value change listener
    optionGroup.removeValueChangeListener(this :: optionGroupValueChanged);
    if(isChecked) {
        //So here it will call value change of option group six time
        optionGroup.getItemIds().stream().forEach( itemId -> optionGroup.select(itemId));
    } else {
        optionGroup.setValue(null);
    }
    optionGroup.addValueChangeListener(this :: optionGroupValueChanged);
}

我检查了 vaadin removeValueChangeListener 方法的代码,它包含 markAsDirty(); 方法。这种行为的原因是什么?我的问题还有其他替代解决方案吗?

注意:vaadin 的版本是 7.5.0

【问题讨论】:

    标签: vaadin vaadin7


    【解决方案1】:

    这是因为this :: optionGroupValueChanged 每次都会创建ValueChangeListener 的新实例。你不想要这个,你想删除非常具体的ValueChangeListener 实例。解决方案是记住(在示例中的私有字段中)对侦听器的引用并将其传递到您的 add 和 remove ValueChangeListener 调用中。

    optionGroupListener = this :: optionGroupValueChanged;
    optionGroup.addValueChangeListener(optionGroupListener);
    
    private void selectAllChecked(ValueChangeEvent valueChangeEvent) {
        final boolean isChecked = (boolean) valueChangeEvent.getProperty().getValue();
        //change here
        optionGroup.removeValueChangeListener(optionGroupListener );
        if(isChecked) {
            optionGroup.getItemIds().stream().forEach( itemId -> optionGroup.select(itemId));
        } else {
            optionGroup.setValue(null);
        }
    //and here
        optionGroup.addValueChangeListener(optionGroupListener );
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-04-26
      • 1970-01-01
      • 1970-01-01
      • 2018-03-08
      • 1970-01-01
      • 2015-05-10
      相关资源
      最近更新 更多