2011-10-11 54 views
7

在我的项目中,我使用了一个ViewScoped bean,并且我有两个页面,一个是主页面和其他详细信息页面。如何保留primefaces数据表的排序顺序?

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

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

+0

此问题的任何输入? – user1234

+0

@BalusC对此有何帮助? – user1234

回答

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); 
} 

就是这样。