私のselectManyCheckboxの値属性は、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>
これは Parameter クラスです (簡略化):
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 が常に前の値で上書きされることがわかります。
- 初期化。selectedValue: (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