首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >原表5动态DataTable预排序

原表5动态DataTable预排序
EN

Stack Overflow用户
提问于 2014-09-10 08:19:27
回答 3查看 4.2K关注 0票数 1

我正在尝试用PrimeFaces5.0构建一个完全动态的DataTable。

我有一个用于eachs列的Config对象,我希望DT从一开始就按其中之一进行排序。

这是我的DT:

代码语言:javascript
复制
<p:dataTable id="ticketTable"
                 widgetVar="ticketTable"
                 value="#{ticketBean.ticketDataModell}"
                 var="ticket"
                 lazy="true"
                 paginator="true"
                 rows="20"
                 sortBy="#{dataPortletConfigBean.sortByKey}"
                 >

sortByKey是一个字符串。这是我想要分类的变量的名称。所以我想用sortBy="#{bean.GiveMeAKey}"代替像sortBy="#{bean.GiveMeAKey}"这样的东西。

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

我怎么才能让这个起作用?谢谢

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-09-10 14:07:29

我现在开始工作了。

第一:问题。我想给数据表一个默认排序(在加载上)的可能性。这就是sortBy-Tag in <p:dataTable>所做或应该做的。

只要你把你的排序字段写在DT标签中,例如sortBy="name",它就能工作。但是,例如,当您传递一个ValueExpression时,sortBy="#{bean.giveMeSomeKey}"。他只是删掉了“#{”,所有的东西都是“”。最后一个“}”尝试使用其结果字符串的名称对字段进行排序。在这种情况下,“赠予giveMeSomeKey”。

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

第二:决心。我检查了PF5.0源代码并修改了DataTableTemplate-File。(这是一个模板,当PF正在构建时,会被填充。它稍后将被编译到DataTable-Class中)。

在这里,我修改了方法protected String resolveSortField()

在此之前:

代码语言:javascript
复制
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);
        }

之后:

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2014-09-10 12:48:36

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

检查您的属性 sortByKey在dataPortletConfigBean中是否返回一个字符串,如in:

代码语言:javascript
复制
public String getSortByKey() {
  return "ticket.number";
}

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

代码语言:javascript
复制
<p:column sortBy="#{ticket.number}" headerText="Number"> 
   #{ticket.number}
</p:column>
票数 0
EN

Stack Overflow用户

发布于 2014-12-24 14:13:36

我不记得这在PF5.0中是否可用,但现在在5.1中,您可以使用sortField属性,它存在于datatable中。这正是为此目的而实施的:

来自Primefaces的文件:

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

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

代码片段:

代码语言:javascript
复制
 <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>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25760515

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档