我知道這個問題很老了,但我只是在這個工作,所以我想我會分享我的未來解決方案。
我們使用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);
}
就是這樣。
此問題的任何輸入? – user1234
@BalusC對此有何幫助? – user1234