我的 selectManyCheckbox 中的 value 属性在通过 ajax 更新时被覆盖。这是我的jsf(1.2)
<h:selectManyCheckbox
id="SelectManyCheckbox"
valueChangeListener="#{parameter.valueChanged}"
value="#{parameter.selectedValues}">
<a4j:support
event="onclick"
reRender="selectionPanel" />
<f:selectItems
value="#{parameter.values}" />
</h:selectManyCheckbox>
这是参数类(简化):
public class Parameter {
List<String> selectedValues;
SelectItemList values;
public void valueChanged(ValueChangeEvent event) {
// here new values and new selectedValues will be set via
// the setters of the two fields
}
}
问题是,新值将被正确设置和显示,但 selectedValues 将保留在 ajax 事件之前的值上。我对其进行了调试,我可以看到 selectedValues 设置正确,但是在重新渲染 selectionPanel 期间将设置 ajax 事件之前的旧 selectedValues。
当我多次触发事件时,我可以看到,我的 selectedValues 总是被之前的值覆盖,如下所示:
- 在里面。选定值:(0)
- Event1 newSelectedValue:(1,2,3,4),实际显示的selectedValue(0)
- Event2 newSelectedValue:(5,6,7,8),实际显示的selectedValue(1,2,3,4)
- Event3 newSelectedValue:(9,10,11,12),实际显示selectedValue(5,6,7,8)
- [...]
这是覆盖 selectedValue 的堆栈跟踪的一部分:
com.my.package.structure.Parameter:setSelectedValues
sun.reflect.NativeMethodAccessorImpl:invoke0
sun.reflect.NativeMethodAccessorImpl:invoke
sun.reflect.DelegatingMethodAccessorImpl:invoke
java.lang.reflect.Method:invoke
javax.el.BeanELResolver:setValue
javax.el.CompositeELResolver:setValue
org.apache.myfaces.el.unified.resolver.FacesCompositeELResolver:setValue
org.apache.el.parser.AstValue:setValue
org.apache.el.ValueExpressionImpl:setValue
com.sun.facelets.el.TagValueExpression:setValue
javax.faces.component.UIInput:updateModel
javax.faces.component.UIInput:processUpdates