2011-10-11 53 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); 
} 

就是這樣。