2013-10-25 28 views
0

我的selectManyCheckbox中的值屬性被ajax更新覆蓋。這裏是我的JSF(1.2)h:selectManyCheckbox選擇的值被上一個值覆蓋

<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總是由前值覆蓋,就像這樣:

  • 初始化。 (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-)
  • [...]

這裏的一部分覆蓋選定值的棧跟蹤:

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 
+0

使用地圖而不是列表,看看會發生什麼。 –

+0

使用地圖不起作用。我們在jsf 1.2。 h:selectManyCheckbox只支持List或Array。 – user1735824

回答

0

解決方案是使用簡單的數組而不是列表。

public class Parameter { 

    String[] selectedValues; //CHANGED 
    SelectItemList values; 

    public void valueChanged(ValueChangeEvent event) { 
     // here new values and new selectedValues will be set via 
     // the setters of the two fields 
    } 

}