2011-10-11 7 views
7

私のプロジェクトでは、ViewScoped Beanを使用しています。メインページとその他の詳細ページの2つのページがあります。primefacesのデータシートのソート順を保持する方法は?

メインページには、ソートとフィルタリングの機能を備えたプライムサーフェスがあります。 データテーブルには、各行にリンクがあります。私が列をソートすると、正しく動作します。メインページのリンクをクリックすると、対応する行の詳細を示す詳細ページに移動します。詳細ページに戻るボタンがあります。私がクリックするとメインページに戻りますが、ソート順はデータテーブルには保持されません。

ソート順を保持する必要があります。どうすればこれを達成できますか?

+0

この質問の入力はありますか? – user1234

+0

@BalusCこれに関する助言? – user1234

答えて

8

私はこの質問がかなり古くなっていることを知っていますが、私はこれに取り組んだので、私は将来私の解決策を分かち合うと考えました。

私たちはPrimeFaces 3.5

これが唯一の遅延ローディングテーブルの上に実装され、メモリ内のテーブルの上に実装されていませんでしたを使用しています。可能な最大の違いは、メモリー内表の列タイプ(クラス)を保管する必要があることです。

まず、ソート状態を保存できる何らかの種類のSessionScopedコントローラが必要です。ソート列とソート順(昇順/降順)の2つの状態を格納する必要があります。

第2に、p:datatableをViewScopedコントローラ(binding="#{viewController.datatable}")のオブジェクトにバインドし、そのための基本的なゲッタとセッタを実装します。 #{pojo.stuff}

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メソッドの2番目のパラメータはJSFスタイルの式、すなわちが必要ですsetterメソッドでは、私はこれを持っています。また、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); 
} 

関連する問題