是否可以在不使用p:columns的情况下对p:dataTable进行动态列排序?

时间:2016-06-06 14:48:49

标签: jsf primefaces

我试图动态显示p:dataTable的列:服务器指示显示哪些列以及按哪种顺序显示。我不能使用常规的p:column标记设置动态订单,因此我使用p:columns标记卡住了。 p:columns标记的问题是:

1)展示中的示例显示它使用String数据,您可以在其中将列名映射到字段,然后使用表达式语言映射来检索数据(如伪吸气剂)

http://www.primefaces.org/showcase/ui/data/datatable/columns.xhtml

如果我有不同的数据类型,那么我可能会遇到一堆基于数据类型的渲染属性的面板(单向显示字符串,以另一种方式显示用户对象等)。

示例:

<p:dataTable value="#{myBean.rows}" var="row">
    <p:columns value="#{myBean.columns}" var="column">

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

        <!-- The content of the cell is dynamic based on the type of the field -->

        <!-- display a String field -->
        <h:outputText rendered="#{myBean.isStringType(column.header)}"                      
                      value="#{row[column.property]}"/>

        <!-- display a Person field -->
        <h:outputText rendered="#{myBean.isPersonType(column.header)}" 
                      value="#{row[column.property].name}, #{row[column.property].email}"/>

    </p:columns>
</p:dataTable>

2)p:columns仅支持所有列的单个sortFunction / filterFunction。由于这些列都具有不同类型的数据,因此它们需要许多不同的排序和过滤方法

p:列可以轻松地显示不同的数据类型以及数据的排序/过滤。它唯一能做的就是有一个动态的订单。

除非我遗漏了什么?有没有办法让它与p:列一起使用?或者有一种优雅的方式让p:列处理所有这些吗?

1 个答案:

答案 0 :(得分:2)

  

看起来我不能使用常规的p:column标签设置动态订单,所以我使用p:columns标签卡住了。

如果#{myBean.columns}列模型在至少视图范围内保持不变,那么您最好使用<c:forEach><p:column><c:choose>。它比<p:columns> + rendered更快,并允许更多动态自由,因为您可以根据类型单独声明每个<p:column>,而不是只有一个<p:columns>,其状态每次迭代都会更改轮。

<p:dataTable value="#{myBean.rows}" var="row">
    <c:forEach items="#{myBean.columns}" var="column">
        <c:choose>
            <c:when test="#{column.type eq 'STRING'}">
                <p:column sortBy="#{row[column.property]}" filterBy="#{row[column.property]}">
                    #{row[column.property]}
                </p:column>
            </c:when>
            <c:when test="#{column.type eq 'PERSON'}">
                <p:column sortBy="#{row[column.property].name}" filterBy="#{row[column.property].name}">
                    #{row[column.property].name}, #{row[column.property].email}
                </p:column>
            </c:when>
            ...
        </c:choose>
    </c:forEach>
</p:dataTable>

另见: