2011-10-11 1 views
7

Nel mio progetto sto usando un bean ViewScoped e ho due pagine una è la pagina principale e l'altra pagina dei dettagli.Come mantenere l'ordinamento delle primefaces datatable?

Nella pagina principale sono disponibili delle primefaces con funzionalità di ordinamento e filtraggio. Il datatable ha un link in ogni riga. Se ordino una colonna, allora funziona correttamente. Se clicco su un link nella pagina principale, andrà alla pagina dei dettagli che mostra i dettagli della riga corrispondente. Nella pagina dei dettagli ho un pulsante indietro. Se clicco su di esso, tornerò alla pagina principale, ma l'ordinamento non viene mantenuto nel datatable.

Ho bisogno di mantenere l'ordinamento. Come posso raggiungere questo obiettivo?

+0

Qualsiasi input per questa domanda? – user1234

+0

@BalusC qualche aiuto su questo? – user1234

risposta

8

So che questa domanda è piuttosto vecchia, ma ho appena lavorato su questo quindi ho pensato di condividere la mia soluzione per il futuro.

Stiamo utilizzando primefaces 3,5

Questa è stata implementata solo su un tavolo di carico pigro e mai attuata su una tabella in memoria. La più grande differenza che potrebbe esistere è che è necessario memorizzare il tipo di colonna (Classe) per una tabella in memoria.

Prima di tutto, è necessario un tipo di controller SessionScoped su cui è possibile salvare lo stato di ordinamento. È necessario memorizzare due stati: ordina la colonna e ordina (crescente/decrescente).

In secondo luogo, associare il p: datatable a un oggetto nel controller ViewScoped (binding="#{viewController.datatable}") e implementare il getter e il setter di base per esso. Nel metodo setter, ho questo:

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; 
} 

I bit importanti sono le linee setValueExpression, il secondo parametro del metodo createValueExpression richiede l'espressione stile JSF, cioè: #{pojo.stuff}. Notate anche come sto usando Object.class come tipo, credo di poterla fare franca perché la tabella è pigra e sto gestendo tutto me stesso nell'implementazione di LazyDataModel.

In terzo luogo, aggiungere l'evento di smistamento al DataTable:

<p:ajax event="sort" listener="#{viewController.sortListener}" /> 

e l'ascoltatore nel controller:

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); 
} 

Questo è tutto.