如何保留primefaces数据表的排序顺序?

时间:2011-10-11 14:45:09

标签: jsf-2 primefaces

在我的项目中,我使用的是ViewScoped bean,我有两个页面,一个是主页面,另一个是详细页面。

在主页面中,我有一个带有排序和过滤功能的primefaces数据表。 数据表在每行中都有一个链接。如果我对列进行排序,那么它可以正常工作。如果我单击主页面中的链接,它将转到显示相应行详细信息的详细信息页面。在详细信息页面中,我有一个后退按钮。如果我点击它,它将带我回到主页面,但排序顺序不会保留在数据表中。

我需要保留排序顺序。我怎样才能做到这一点?

2 个答案:

答案 0 :(得分:8)

我知道这个问题已经很久了,但我刚刚开始研究这个问题,所以我认为我将为未来分享我的解决方案。

我们正在使用PrimeFaces 3.5

这只在延迟加载表上实现,并且从未在内存表中实现。可能存在的最大区别是您需要存储内存表的列类型(Class)。

首先,您需要某种SessionScoped控制器,您可以将排序状态保存到。您需要存储两种状态:排序列和排序顺序(升序/降序)。

其次,将p:datatable绑定到ViewScoped控制器中的对象(binding="#{viewController.datatable}"),并为其实现基本的getter和setter。在setter方法中,我有这个:

public void setDatatable(DataTable datatable) {
    ExpressionFactory expressionFactory = ExpressionFactory.newInstance();
    ELContext elContext = FacesContext.getCurrentInstance().getELContext();
    if(!datatableInitialized) {
        if(getSessionController().getSortState() == null) {
            datatable.setValueExpression("sortBy", expressionFactory.createValueExpression(elContext, DEFAULT_SORT_COLUMN, Object.class));
            datatable.setSortOrder(DEFAULT_SORT_DIRECTION);
        } else {
            SortState state = getSessionController().getSortState();
            datatable.setValueExpression("sortBy", expressionFactory.createValueExpression(elContext, state.getValueExpression(), Object.class));
            datatable.setSortOrder(state.getDirection());
        }
        datatableInitialized = true;
    }
    this.datatable = datatable;
}

重要的位是setValueExpression行,createValueExpression方法的第二个参数需要JSF样式表达式,即:#{pojo.stuff}。还要注意我是如何使用Object.class作为类型的,我相信我可以逃避这个因为表是延迟加载的,我在LazyDataModel实现中自己处理所有的排序。

第三,将排序事件添加到数据表:

<p:ajax event="sort" listener="#{viewController.sortListener}" />

和控制器中的监听器:

public void sortListener(SortEvent event) {
    SortState state = new SortState();
    state.setValueExpression(event.getSortColumn().getValueExpression("sortBy").getExpressionString());
    state.setDirection(event.isAscending() ? "ascending" : "descending");
    getSessionController().setOpportunitiesSortState(state);
}

就是这样。

答案 1 :(得分:1)

5年后,PrimeFaces开箱即用地支持此功能。从版本6.0.10开始,PrimeFaces添加了TableState feature。即使离开页面后,它也允许您的DataTable保持其状态。

如文档中所述,您需要做的就是在multiViewState上启用DataTable属性。

<p:dataTable id="tableStateTable" value="#{view.items}" var="item" 
             multiViewState="true">
    ...
</p:dataTable>