【问题标题】:h:selectManyCheckbox selected values get overwritten with last valueh:selectManyCheckbox 选择的值被最后一个值覆盖
【发布时间】:2013-10-25 11:14:38
【问题描述】:

我的 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

【问题讨论】:

  • 使用地图而不是列表,看看会发生什么。
  • 使用地图不起作用。我们在 jsf 1.2。 h:selectManyCheckbox 仅支持 List 或 Array。

标签: ajax jsf richfaces jsf-1.2


【解决方案1】:

解决方案是使用简单的数组而不是列表。

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
    }

}

【讨论】:

    猜你喜欢
    • 2013-10-03
    • 2018-04-22
    • 1970-01-01
    • 1970-01-01
    • 2019-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-09
    相关资源
    最近更新 更多