Sorting Primefaces 5动态数据表预排序

Sorting Primefaces 5动态数据表预排序,sorting,jsf,primefaces,datatables,Sorting,Jsf,Primefaces,Datatables,我正试图用Primefaces 5.0构建一个完全动态的数据表 我为eachs列提供了一个Config对象,我希望DT从一开始就按其中一个进行排序 这是我的DT: <p:dataTable id="ticketTable" widgetVar="ticketTable" value="#{ticketBean.ticketDataModell}" var="ticket"

我正试图用Primefaces 5.0构建一个完全动态的数据表

我为eachs列提供了一个Config对象,我希望DT从一开始就按其中一个进行排序

这是我的DT:

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

肮脏的东西是一根绳子。这是我要排序的变量的名称。 所以我想用
sortBy=“{bean.GiveMeAKey}”
替换类似
sortBy=“key”

但它不起作用。 我发现:
无法解析属性:[…]的sortByKey

我怎样才能让它工作?
谢谢

我测试了你的要求,效果很好

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

public String getSortByKey() {
  return "ticket.number";
}
还要确保目标列定义了sortBy属性:

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

#{票证号码}
我现在可以用了

第一:问题。 我想给数据表提供一个默认排序(加载时)的可能性。 这就是
中的
排序标记所做或应该做的

只要在DT标记中写入排序字段,例如
sortBy=“name”
它就可以工作。 但是当您传递一个值表达式时,例如
sortBy=“#{bean.giveMeSomeKey}”
。他只是把“#{”,所有的东西都切掉“.”,最后一个“}”,然后尝试用结果字符串的名称按字段排序。在本例中为“giveMeSomeKey”

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

第二:决心。 我签出了PF 5.0-Sources并修改了DataTableTemplate文件。(它是一个模板,在构建PF时填充。稍后将编译到DataTable类中)

在那里,我修改了方法
protectedstringresolvesortfield()

之前:

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:


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

从Primefaces文档:

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

之后,必须使用“字段”属性为每列定义一个类似的值。如果列不是动态的,只是排序,那么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>


在一列中,它当然起作用。但是我希望它在DT头
[…]
中作为默认排序。我现在发现了问题。DT头不能解析ValueExpressions,所以我修改了PF源代码,现在它可以工作了。是的,我就是这样测试的,在datatable定义的默认排序上。但是在PF 5.0中它不能工作。至少我看到的源代码不是这样。