我正在尝试使用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: [...]
我怎样才能让它发挥作用? 感谢
答案 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>