PrimeFaces数据表默认sortBy来自支持bean

时间:2017-03-22 15:12:24

标签: jsf primefaces

我有一个带有POJO对象的数据表:

<p:dataTable id="table" var="object" sortBy="#{object.name}" sortOrder="DESCENDING">

object包含字段idnamedatesize。我可以使用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

它不起作用,数据表在呈现页面后没有排序。

请帮忙。

1 个答案:

答案 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

另见: