Wiem, że to pytanie jest dość stare, ale pracowałem nad tym, więc pomyślałem, że podzielę się moim rozwiązaniem na przyszłość.
Używamy PrimeFaces 3,5
ten został zrealizowany tylko na leniwy tabeli załadunku i nigdy wdrożone na stole w pamięci. Największa różnica, jaka może istnieć, to konieczność przechowywania typu kolumny (Class) dla tabeli w pamięci.
Przede wszystkim potrzebujesz jakiegoś kontrolera SessionScoped, do którego możesz zapisać stan sortowania. Będziesz musiał przechowywać dwa stany: kolumnę sortowania i kolejność sortowania (rosnąco/malejąco).
Po drugie, należy powiązać p: datatable z obiektem w kontrolerze ViewScoped (binding="#{viewController.datatable}"
) i zaimplementować podstawowy program pobierający i ustawiający dla niego. W metodzie setter, mam to:
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;
}
Ważnymi bity są linie setValueExpression, drugi parametr metody createValueExpression wymaga styl ekspresji JSF, a mianowicie: #{pojo.stuff}
. Zwróć też uwagę na to, że używam Object.class jako typu, wydaje mi się, że mogę sobie z tym poradzić, ponieważ tabela jest leniwą wersją i sam zajmuję się sortowaniem w implementacji LazyDataModel.
trzecie, dodać wydarzenie do sortowania DataTable:
<p:ajax event="sort" listener="#{viewController.sortListener}" />
i słuchacz w kontrolerze:
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);
}
To wszystko.
Wszelkie dane wejściowe dla tego pytania? – user1234
@BalusC jakiejkolwiek pomocy w tej sprawie? – user1234