PrimeFaces 数据表默认排序来自支持 bean



>我有一个带有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();
}

我的任务检测用户要排序的列并将其保存到数据库。重新加载后,数据表应按此列排序。

当我设置

sortBy="#{bean.sortBy}" // sortBy = name

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

请帮忙。

如果将数据表绑定到 Bean 中的org.primefaces.component.datatable.DataTable对象或在Bean 中找到表组件,则可以使用 table 对象以编程方式设置sortBy值表达式。

要了解PrimeFaces如何处理排序,您可以在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可能会有所帮助。它还提供了创建值表达式的快捷方式方法。

另请参阅:

  • "绑定"属性在 JSF 中如何工作?何时以及如何使用它?
  • 以编程方式获取 Bean 构造函数中 JSF 视图的 UIComponents
  • 如何在 JSF 中设置 HtmlOutputTag 的值?