【问题标题】:PrimeFaces dataTable with variable columns and specific editable cells具有可变列和特定可编辑单元格的 PrimeFaces 数据表
【发布时间】:2015-05-14 13:42:04
【问题描述】:

我需要创建一个表格,其中标题列表来自模型。表格内容也存储在模型和数据上的 p:dataTable 循环中,以根据列名显示内容。

问题是我需要使一些特定的单元格可编辑。对于输出数据没有问题,因为我使用模型方法,它同时采用实体和列名,并根据列名从实体返回正确的信息。问题在于我不知道如何在实体中设置的可编辑单元格的输入。

<p:dataTable id="processTable"  var="entity" value="#{home.process.headerEntities}" tableStyle="width:auto" draggableColumns="true" editable="true" editMode="cell">

    <p:columns value="#{home.process.columns}" var="columnHead" >

        <f:facet name="header">
            <h:outputText value="#{columnHead}"/>
        </f:facet>

        <p:cellEditor>
            <f:facet name="output">
                <h:outputText value="#{home.process.getData(entity, columnHead)}" />
            </f:facet>
            <f:facet name="input">
                <p:inputText value="#{home.process.getData(entity, columnHead)}" rendered="#{home.process.isEditable(columnHead)}"  style="width:100%" />
            </f:facet>
        </p:cellEditor>


    </p:columns>

</p:dataTable>

根据最佳答案更改后

<p:dataTable id="processTable"  var="entity" value="#{home.process.headerEntities}" tableStyle="width:auto" draggableColumns="true" editable="true" editMode="cell">

                <p:columns value="#{home.process.columns}" var="columnHead" >

                    <f:facet name="header">
                        <h:outputText value="#{columnHead}"/>
                    </f:facet>

                    <p:cellEditor>
                        <f:facet name="output">
                            <h:outputText value="#{entity[home.process.columnPropertyMap[columnHead]]}" />
                        </f:facet>
                        <f:facet name="input">
                            <p:inputText value="#{entity[home.process.columnPropertyMap[columnHead]]}" rendered="#{home.process.isEditable(columnHead)}"  style="width:100%" />
                        </f:facet>
                    </p:cellEditor>


                </p:columns>

            </p:dataTable>

【问题讨论】:

  • 把dataTable绑定到一个backing bean怎么样?
  • @DaDaDom:我不建议这样做。只需使用 XHTML 来声明/创建组件。它比在 Java 中更易于维护。

标签: jsf primefaces


【解决方案1】:

输入组件的值必须绑定到一个可写的值表达式。你所拥有的是一个直接的 getter 方法调用,因此基本上是只读的。这确实行不通。您需要指定#{entity} 的属性名称。您可以使用大括号表示法将属性名称指定为变量,例如 #{entity[propertyName]}

所以,基本上:

<p:dataTable value="#{bean.entities}" var="entity" editable="true" editMode="cell">
    <p:columns value="#{bean.propertyNames}" var="propertyNames">
        <p:cellEditor>
            <f:facet name="output">
                #{entity[propertyName]}
            </f:facet>
            <f:facet name="input">
                <p:inputText value="#{entity[propertyName]}" />
            </f:facet>
        </p:cellEditor>
    </p:columns>
</p:dataTable>

至于列标题,不如将其重构为Map&lt;String, String&gt;,其中键是propertyName,值是标题。

        <f:facet name="header">
            #{bean.columnHeaders[propertyName]}
        </f:facet name="header">

或者更好的是,在propertyName 代表包键的一部分的地方使用普通的 i18n 资源包。

        <f:facet name="header">
            #{bundle['table.column.header.' += propertyName]}
        </f:facet name="header">

至于可编辑检查,不如将 propertyNameeditable 包装在另一个 bean 中(如果您不想使用 i18n 包,也可能还有 columnHeader),例如Field 然后像下面这样使用:

    <p:columns value="#{bean.fields}" var="field">
        <p:cellEditor>
            <f:facet name="output">
                #{entity[field.propertyName]}
            </f:facet>
            <f:facet name="input">
                <p:inputText value="#{entity[field.propertyName]}" rendered="#{entity[field.editable]}" />
            </f:facet>
        </p:cellEditor>
    </p:columns>

总而言之,归根结底就是准备和提供视图期望的正确模型。这样getData() 就没有必要了。

【讨论】:

  • 亲爱的 BalusC,我根据您的回答对我的代码进行了更改,并且效果很好。非常感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-11
  • 1970-01-01
  • 2013-08-21
  • 1970-01-01
  • 2017-07-02
  • 2014-08-03
相关资源
最近更新 更多