我知道这个问题很老了,但我只是在这个工作,所以我想我会分享我的未来解决方案。
我们使用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