【发布时间】:2014-07-09 09:41:19
【问题描述】:
我被困在这个当前的问题上,也许有人可以帮助我解决这个问题: 我尝试基于 JSF 2.2 和最新的 primefaces 版本 (5.0) 构建动态规则编辑器。 因此,我构建了一个 p:dataTable,它在单独的列中显示规则值。要编辑值,编辑器会从使用的数据库表中生成一个可选择的值列表。
一切正常,但如果我尝试在可选值列表中选择另一个值并单击保存按钮,旧值将提交给 bean,并且 h:selectOneMenu 显示最后使用的值。
我尝试了很多解决方案,但这是 JSF 方面的当前解决方案:
<h:form id="ruleTableForm">
<p:dataTable value="#{table.rules}" var="rule">
<p:columns var="column" value="#{table.columns}" headerText="#{column.header}" width="250">
<h:selectOneMenu id="columnSelectMenu" value="#{rule.ruleColumnToValueMap[column].value}">
<f:selectItems value="#{column.pickList.entrySet()}"
var="pickItem" itemLabel="#{pickItem.value}"
itemValue="#{pickItem.key}" />
</h:selectOneMenu>
</p:columns>
</p:dataTable>
<div class="button_group">
<h:commandLink styleClass="add_button" action="#{regelEditorViewController.saveRuleset()}">Save</h:commandLink>
</div>
</h:form>
我的 ViewController 中的 xhtml-File 中使用的部分如下所示:
@ManagedBean
@ViewScoped
public class RegelEditorViewController implements Serializable {
private RegelEditorViewData viewData;
@Produces
public RegelEditorViewData getViewData() {
if (this.viewData == null) {
this.viewData = this.viewDataService.produceViewData(0L,20L);
}
return this.viewData;
}
public void saveRuleset() {
RulesetViewData rulesetViewData = this.viewData.getCurrentRuleset();
this.viewDataService.saveRuleset(rulesetViewData);
this.refreshViewData();
}
}
ruleColumnToValueMap 是一个 Map:
private Map<RuleTableColumnViewData, Value> ruleColumnToValueMap = new LinkedHashMap<RuleTableColumnViewData, Value>();
...并且“ruleTableColumnViewData”对象中的“pickList”也是一个带有字符串的 Map:
private Map<String, String> pickList = new LinkedHashMap<String, String>();
我尝试过但没有奏效的解决方案:
使用 ajax setter,它选择值(但在 setter 方法中值为 null)
<f:ajax listener="#{regelEditorViewController.selectedRuleColumnValueChanged(table, rule, column, rule.ruleColumnToValueMap[column].value)}" render="@form" />
使用即时 ajax 设置器,它总是将最后设置的值发送到 bean:
<f:ajax listener="#{regelEditorViewController.selectedRuleColumnValueChanged(table, rule, column, rule.ruleColumnToValueMap[column].value)}" immediate="true" render="@form" />
尝试使用 p:selectOneMenu 但它似乎有很多错误:无法更改所选项目,组件不显示菜单
尝试使用“pickList”列表中的“SelectItem”和“ruleColumnToValueMap”映射中的列使用“SelectItem”
也许有人有可能的解决方案可以帮助我?
【问题讨论】:
-
你好,好像是用form提交的信息正确,但是bean端没有正确的映射。
Primefaces 有一个行/单元格编辑器,但那个东西没有帮助,因为它也没有将客户端信息设置为 viewdata 对象。
标签: java null selectonemenu