>我有一个带有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();
}
我的任务检测用户要排序的列并将其保存到数据库。重新加载后,数据表应按此列排序。
当我设置
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 的值?