删除值更改侦听器
Remove value change listener
我在值更改侦听器中遇到问题。
我在具有六个复选框的 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
这是因为 this :: optionGroupValueChanged
每次都会创建 ValueChangeListener
的新实例。你不想要这个,你想要删除 ValueChangeListener
的非常具体的实例。解决方案是记住(在示例中的私有字段中)对侦听器的引用并将其传递到您的添加和删除 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 );
}
我在值更改侦听器中遇到问题。
我在具有六个复选框的 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
这是因为 this :: optionGroupValueChanged
每次都会创建 ValueChangeListener
的新实例。你不想要这个,你想要删除 ValueChangeListener
的非常具体的实例。解决方案是记住(在示例中的私有字段中)对侦听器的引用并将其传递到您的添加和删除 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 );
}