我有一个表单,其中某些表单字段是根据用户选择的产品动态生成的。当用户选择产品时,将从数据库中提取产品属性,并将相应的表单字段添加到视图中。提交表单时,动态添加的字段的值也会发送到服务器。但是,保存动态字段值的模型对象不会更新。(使用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;
}
}
答案 0 :(得分:1)
我能让它工作的唯一方法是为每个表单字段添加ajax值更改事件。模型bean使用ajax更新进行更新。很明显,模型bean不会使用发布请求进行更新,但会反映价值变化事件。
<p:ajax event="valueChange" process="@this"
update="@widgetVar(productAttibuteGrid)"/>