【问题标题】:JSF 2.2 dynamic h:selectOneMenu in p:dataTable submit old valueJSF 2.2 动态 h:selectOneMenu 在 p:dataTable 提交旧值
【发布时间】: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


【解决方案1】:

这个答案上面的例子工作正常,失败是控制器没有将数据保存到数据库中!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-18
    • 1970-01-01
    • 2016-03-08
    • 2013-11-19
    • 2014-06-14
    • 2014-07-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多