我有一个带有POJO对象的数据表:
<p:dataTable id="table" var="object" sortBy="#{object.name}" sortOrder="DESCENDING">
object
包含字段id
,name
,date
,size
。我可以使用xhtml设置默认排序字段,但我想从支持bean设置它。
当用户为示例id
创建排序请求时,我能够解析列name
。
public void sortEventListener(AjaxBehaviorEvent actionEvent) {
String id = ((SortEvent) actionEvent).getSortColumn().getColumnKey();
String[] idPath = id.split(":");
sortBy = idPath[idPath.length - 1];
sortOrder = ((SortEvent) actionEvent).isAscending();
}
我的任务检测哪个列用户想要排序并将其持久保存到db。重新加载后,数据表应按此列排序。
当我设置
sortBy="#{bean.sortBy}" // sortBy = name
它不起作用,数据表在呈现页面后没有排序。
请帮忙。
答案 0 :(得分:4)
如果将数据表绑定到bean中的org.primefaces.component.datatable.DataTable
对象或,请在bean中找到表组件,可以使用表对象设置sortBy
以编程方式表达值。
要了解PrimeFaces如何处理排序,您可以查看source code at GitHub。
如果您有排序列,则可以轻松获取排序值表达式。所以,在你的听众中你可以使用类似的东西:
UIColumn sortColumn = sortEvent.getSortColumn();
ValueExpression sortByVE = sortColumn.getValueExpression("sortBy");
顺便说一下,您可以在排序侦听器方法中用AjaxBehaviorEvent
替换参数类型SortEvent
。
现在,存储sortByVE
表达式,并在需要时将其设置为绑定表的sortBy
值表达式:
dataTable.setValueExpression("sortBy", sortByVE);
如果要从头创建值表达式,请使用以下内容:
FacesContext context = FacesContext.getCurrentInstance();
ExpressionFactory ef = context.getApplication().getExpressionFactory();
ValueExpression ve = ef.createValueExpression(context.getELContext(),
"#{object.name}",
Object.class);
dataTable.setValueExpression("sortBy", ve);
在此示例中"#{object.name}"
已修复。您应该根据从排序侦听器获得的值来构造它。
如果您想在bean中找到您的表,OmniFaces Components可能会有所帮助。它还提供shortcut method to create value expressions。
另见: