【问题标题】:JSF Model Beans are not updated for Dynamically Created Form Fields不为动态创建的表单字段更新 JSF 模型 Bean
【发布时间】:2018-03-27 21:52:12
【问题描述】:

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

您可以在下面看到创建动态字段的 facelet。当属性列表更新时,“attributeFilterPanel”会通过 ajax 调用进行更新。

attributeFilters 是一个地图。对于每个属性,过滤器映射都预先填充了一个使用 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>

Filter 是一个简单的 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;
}

}

【问题讨论】:

    标签: jsf primefaces mojarra


    【解决方案1】:

    我可以让它工作的唯一方法是为每个表单字段添加 ajax 值更改事件。模型 bean 使用 ajax 更新进行更新。奇怪的是,模型 bean 没有随发布请求更新,但反映了值更改事件。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-08-10
      • 2010-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多