2011-10-11 13 views
7

W moim projekcie używam bean ViewScoped i mam dwie strony, jedna to strona główna, a druga strona szczegółów.Jak zachować porządek sortowania najważniejszych obiektów?

Na stronie głównej mam dostępne pierwotne parametry z funkcją sortowania i filtrowania. Moduł datatable ma łącze w każdym wierszu. Jeśli posortuję kolumnę, to działa poprawnie. Jeśli kliknę link na stronie głównej, przejdzie do strony ze szczegółami przedstawiającymi szczegóły odpowiedniego wiersza. Na stronie szczegółów mam przycisk Wstecz. Jeśli go kliknę, zabierze mnie z powrotem do strony głównej, ale kolejność sortowania nie zostanie zachowana w datatable.

Muszę zachować kolejność sortowania. Jak mogę to osiągnąć?

+0

Wszelkie dane wejściowe dla tego pytania? – user1234

+0

@BalusC jakiejkolwiek pomocy w tej sprawie? – user1234

Odpowiedz

8

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.

Powiązane problemy