【问题标题】:How to retain the sort order of primefaces datatable?如何保留primefaces数据表的排序顺序?
【发布时间】:2011-10-11 14:45:09
【问题描述】:

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

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

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

【问题讨论】:

  • 这个问题有什么意见吗?

标签: jsf primefaces


【解决方案1】:

我知道这个问题已经很老了,但我刚刚解决了这个问题,所以我想我会分享我未来的解决方案。

我们正在使用 PrimeFaces 3.5

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

首先,您需要某种可以保存排序状态的 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);
}

就是这样。

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2013-05-07
      • 1970-01-01
      • 2018-04-11
      • 1970-01-01
      • 2013-02-18
      • 1970-01-01
      • 1970-01-01
      • 2017-04-26
      • 1970-01-01
      相关资源
      最近更新 更多