对于动态创建的表单字段,不会更新JSF模型Bean

时间:2017-10-16 11:27:57

标签: jsf primefaces mojarra

我有一个表单,其中某些表单字段是根据用户选择的产品动态生成的。当用户选择产品时,将从数据库中提取产品属性,并将相应的表单字段添加到视图中。提交表单时,动态添加的字段的值也会发送到服务器。但是,保存动态字段值的模型对象不会更新。(使用ViewScoped) 我试过ui:repeat和p:dataGrid。(我读过ui:重复实现mojarra是有问题的)没有什么改变。

下面您可以看到创建动态字段的facelet。当属性列表更新时,' attributeFilterPanel'用ajax调用更新。

attributeFilters是一个Map。对于每个属性,过滤器映射都预先填充了一个使用attribute.name作为键的条目。

非常感谢任何帮助。 谢谢。

注意:我正在运行Mojarra 2.2.12。

    <h:panelGroup id="attributeFilterPanel">
    <h:panelGroup id="filtersGroup" rendered="#{not empty attributes }">
        <p:dataGrid columns="3" var="attribute" value="#{attributes}" layout="grid" paginator="false">
            <h:panelGroup>
                <p:outputLabel value="#{attribute.label}"/>

                <p:selectOneMenu id="match_mode_${attribute.name}"
                                 rendered="#{attribute.valueType =='STRING'}"
                                 value="#{attributeFilters[attribute.name].matchMode}">
                    <f:selectItem itemValue="EQUALS" itemLabel="#{msg.equals}"/>
                    <f:selectItem itemValue="CONTAINS" itemLabel="#{msg.contains}"/>
                    <f:selectItem itemValue="STARTS_WITH" itemLabel="#{msg.startsWith}"/>
                    <f:selectItem itemValue="ENDS_WITH" itemLabel="#{msg.endsWith}"/>
                </p:selectOneMenu>

                <p:selectOneMenu id="amatch_mode_${attribute.name}"
                                 rendered="#{attribute.valueType =='INTEGER' or attribute.valueType == 'NUMERIC'}"
                                 value="#{attributeFilters[attribute.name].matchMode}">
                    <f:selectItem itemValue="EQUALS" itemLabel="#{msg.equals}"/>
                    <f:selectItem itemValue="LESS_OR_EQUAL" itemLabel="#{msg.lessOrEqual}"/>
                    <f:selectItem itemValue="GREATER_OR_EQUAL" itemLabel="#{msg.greaterOrEqual}"/>
                </p:selectOneMenu>



                <p:inputText id="sattribute_${attribute.name}"
                             rendered="#{attribute.valueType =='STRING'}"
                             value="#{attributeFilters[attribute.name].value}"/>
                <p:inputNumber id="iattribute_${attribute.name}"
                               rendered="#{attribute.valueType == 'INTEGER'}" decimalPlaces="0"
                               value="#{attributeFilters[attribute.name].value}"/>
                <p:inputNumber id="nattribute_${attribute.name}"
                               rendered="#{attribute.valueType == 'NUMERIC'}" decimalPlaces="3"
                               value="#{attributeFilters[attribute.name].value}"/>
                <p:selectBooleanCheckbox id="battribute_${attribute.name}"
                                         rendered="#{attribute.valueType == 'BOOLEAN'}"
                                         value="#{attributeFilters[attribute.name].value}"/>
            </h:panelGroup>
        </p:dataGrid>
    </h:panelGroup>
</h:panelGroup>

过滤器是一个简单的pojo。

public class Filter {
private String name;
private Object value;
private MatchMode matchMode;

public Filter(String name) {
    this.name = name;
    this.matchMode = MatchMode.EQUALS;
}


public void setValue(Object value) {
    this.value = value;
}
public Object getValue() {
    return value;
}

public void setMatchMode(MatchMode matchMode) {
    this.matchMode = matchMode;
}

public String getName() {
    return name;
}


public MatchMode getMatchMode() {
    return matchMode;
}

}

1 个答案:

答案 0 :(得分:1)

我能让它工作的唯一方法是为每个表单字段添加ajax值更改事件。模型bean使用ajax更新进行更新。很明显,模型bean不会使用发布请求进行更新,但会反映价值变化事件。

<p:ajax event="valueChange" process="@this"
                                    update="@widgetVar(productAttibuteGrid)"/>