私はこの質問がかなり古くなっていることを知っていますが、私はこれに取り組んだので、私は将来私の解決策を分かち合うと考えました。
私たちは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);
}
。
この質問の入力はありますか? – user1234
@BalusCこれに関する助言? – user1234