【发布时间】: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