PrimeFaces dataTable具有可变列和特定可编辑单元格

时间:2015-05-14 13:42:04

标签: jsf primefaces

我需要创建一个表格,其中标题列表来自模型。表内容也存储在模型中,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>
  

根据BEST ANSWER进行更改后

<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>

1 个答案:

答案 0 :(得分:3)

输入组件的值必须绑定到可写值表达式。你在那里有一个直接的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<String, String>,其中键是propertyName,值是标题。

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

或者更好的是,使用普通的i18n资源包,其中propertyName代表捆绑密钥的一部分。

        <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()