Primefaces 5动态DataTable预排序

时间:2014-09-10 08:19:27

标签: sorting jsf primefaces datatables

我正在尝试使用Primefaces 5.0构建一个完全动态的DataTable。

我为每个列都有一个Config-Object,我希望DT从一开始就按其中一个进行排序。

这是我的DT:

<p:dataTable id="ticketTable"
                 widgetVar="ticketTable"
                 value="#{ticketBean.ticketDataModell}"
                 var="ticket"
                 lazy="true"
                 paginator="true"
                 rows="20"
                 sortBy="#{dataPortletConfigBean.sortByKey}"
                 >

sortByKey是一个String。它是我想要排序的变量的名称。 所以我想用sortBy="key"替换sortBy="#{bean.GiveMeAKey}"之类的内容。

但它不起作用。 我明白了:could not resolve property: sortByKey of: [...]

我怎样才能让它发挥作用? 感谢

3 个答案:

答案 0 :(得分:1)

我现在就开始工作了。

第一:问题。 我想给Data-Table提供一个默认排序(加载时)的可能性。 那就是sortBy - <p:dataTable>中的标记做了什么或应该做什么。

您可以在DT-Tag中编写排序字段,例如sortBy="name"它有效。 但是当您传递ValueExpression时,例如sortBy="#{bean.giveMeSomeKey}"。他只是削减了#,&#39 ;,所有东西都是&#39;。&#39;最后的&#39;}&#39;远离尝试按字段排序,并使用其结果String的名称。在这种情况下,&#39; giveMeSomeKey&#39;。

这使得无法使用动态值进行默认排序。 (至少在PF 5.0中)

第二:解决。 我检查了PF 5.0-Sources并修改了DataTableTemplate-File。 (它是一个模板,在构建PF时填充。稍后将编译成DataTable类。)

我修改了方法protected String resolveSortField()

在:

protected String resolveSortField() {
        UIColumn column = this.getSortColumn();
        String sortField = null;
        ValueExpression tableSortByVE = this.getValueExpression("sortBy");
        Object tableSortByProperty = this.getSortBy();
        if(column == null) {
            sortField = (tableSortByVE == null) 
                     ? (String) tableSortByProperty 
                     : resolveStaticField(tableSortByVE);
        }

后:

protected String resolveSortField() {
        UIColumn column = this.getSortColumn();
        String sortField = null;
        ValueExpression tableSortByVE = this.getValueExpression("sortBy");
        Object tableSortByProperty = this.getSortBy();
        if(column == null) {
            sortField = (tableSortByVE != null) 
                ? tableSortByVE.getExpressionString().contains("[") 
                ? resolveDynamicField(tableSortByVE) 
                : resolveStaticField(tableSortByVE) 
                : (String) tableSortByProperty;
        }

在构建并将其包含到我的项目中后,它就可以了。

所以现在我可以告诉我的DT:

<p:dataTable [...] sortBy="#{ticket[dataPortletConfigBean.sortByKey]}" 它将默认排序我的DT在(字符串)键之后我用sortByKey传递给他,只要它是我的票证中的一个字段。

它不是完美的解决方案,但它确实有效。

答案 1 :(得分:0)

我测试了你的要求并且工作正常。

检查dataPortletConfigBean中的属性 sortByKey是否返回如下字符串:

public String getSortByKey() {
  return "ticket.number";
}

还要确保目标列定义sortBy属性:

<p:column sortBy="#{ticket.number}" headerText="Number"> 
   #{ticket.number}
</p:column>

答案 2 :(得分:0)

我不记得这是否在PF 5.0中可用,但现在在5.1中您可以使用 datatable 中的 sortField 属性。这是为了这个目的而实现的:

来自Primefaces文档:

  

sortField:要传递延迟加载方法的字段的名称   排序。如果未指定,则sortBy表达式为   用于提取名称。

之后,您必须使用field属性为每列定义类似的值。如果列不是动态的,那么field属性将与列本身具有相同的值。

代码片段:

 <p:dataTable  var="repo" value="#{repoStrategy.flaggedRepos}" sortOrder="${repoStrategy.sortOrder}" sortField="${repoStrategy.sortBy}"
                                  style="width: 100%" paginator="true" rows="10" rowIndexVar="rowIndex" >

           <p:column headerText="Name" sortBy="#{repo.name}" field="repo.name">
                  <a href="#{repo.url}" target="_blank">#{repo.name}</a>
           </p:column>