0

我在使用 primefaces 单元格编辑表时遇到了一些问题。所以,我有一个数据表,其中包含一个可编辑的列。此数据表通过 jpa 实体列表填充。

专注于最重要的事情,我的可编辑单元格在输出方面有一个 outputText,在输入方面有一个 selectOneMenu,它由一个枚举填充。

我的问题是,数据表在开始时正确加载,我可以成功编辑想要的字段,selectOneMenu 正确填充了枚举。如果我在 selectOneMenu 中选择一个选项,它会很好,但是当我在数据表外部单击(退出编辑模式)时,它会得到一个错误的值,因为它会获取代码,并且它应该得到描述。

我的代码:

枚举

public enum EnumSimNao implements DetalheDominioEnum {
    /**
    * Sim
    */
    S("Sim"),
    /**
    * Não
    */
    N("Não");

Enum 有一个 getter,可以刷新基于某些服务的值。它总是从服务中获取这些值。我已经测试过了,值就在这里。当我说描述时,我的意思是“Sim”或“Nao”,代码分别是“S”或“N”。它来自数据库的代码,通过 jpa 实体中的 @Enumerated 属性与枚举相关联。当我拥有#{tp.respostaObrigatoria.description}它时,它会根据返回的代码返回“Sim”或“Não”。

    public String getDescription() {
    DetalheEstaticoDominioEnumHelper.INSTANCE.fillDescriptions(this);
    return description == null ? defaultDescription : description;
}

@Override
public void setDescription(String description) {
    this.description = description;
}

html :

                        <p:cellEditor>
                        <f:facet name="output">
                            <h:outputText
                                value="#{tp.respostaObrigatoria.description}" />
                        </f:facet>
                        <f:facet name="input">
                            <h:selectOneMenu value="#{tp.respostaObrigatoria}">
                                <f:selectItems value="#{Factories.enumSimNao}" var="simNao"
                                    itemLabel="#{simNao.description}" itemValue="#{simNao}" />
                            </h:selectOneMenu>
                        </f:facet>
                    </p:cellEditor>

tp是一个实体,它来自一个来自支持 bean 的列表:

所以,当我编辑单元格时,我可以看到两个描述(“Sim”或“Nao”),但是当我退出编辑模式时,它显示“S”或“N”。最后,如果我刷新页面,它会得到我选择的正确描述值。

你有什么秘诀吗?

谢谢

4

1 回答 1

1

Primefaces 3.5 有这个错误,显然是在这个问题http://code.google.com/p/primefaces/issues/detail?id=6116下提交的,并在版本 3.5.15 中解决,该版本仅适用于 Elite 版本。4.0 版似乎已经修复了这个问题。

我找到了 3.5 的解决方法,它涉及重新渲染包含数据表的表单,这对我来说很好。您需要做的是在 selectOneMenu 组件中使用 ajax 事件侦听器,它会触发表单的呈现,如下所示:

<p:cellEditor>
    <f:facet name="output">
        <h:outputText
            value="#{tp.respostaObrigatoria.description}" />
    </f:facet>
    <f:facet name="input">
        <h:selectOneMenu value="#{tp.respostaObrigatoria}">
            <f:selectItems value="#{Factories.enumSimNao}" var="simNao"
                itemLabel="#{simNao.description}" itemValue="#{simNao}" />
        <f:ajax listener="#{bean.submit}" render="@form" />
        </h:selectOneMenu>
    </f:facet>
</p:cellEditor>
于 2014-01-30T16:52:37.217 回答