2011-10-11 10 views
7

En mi proyecto estoy usando un ViewScoped Bean y tengo dos páginas, una es la página principal y la otra página de detalles.¿Cómo retener el orden de clasificación de la tabla de datos de las primeas?

En la página principal tengo una datatable de primos con funciones de clasificación y filtrado. La tabla de datos tiene un enlace en cada fila. Si clasifico una columna, entonces funciona correctamente. Si hago clic en un enlace en la página principal, irá a la página de detalles que muestra los detalles de la fila correspondiente. En la página de detalles, tengo un botón de retroceso. Si hago clic en él, me llevará de vuelta a la página principal, pero el orden de clasificación no se conserva en la tabla de datos.

Necesito conservar el orden de clasificación. ¿Cómo puedo conseguir esto?

+0

¿Alguna de las entradas para esta pregunta? – user1234

+0

@BalusC ¿Alguna ayuda en esto? – user1234

Respuesta

8

Sé que esta pregunta es bastante antigua, pero acabo de trabajar en esto, así que pensé que compartiría mi solución para el futuro.

Estamos utilizando PrimeFaces 3,5

Esto sólo fue implementado en una mesa de carga lenta y nunca puestos en práctica en una tabla en memoria. La mayor diferencia que podría existir es que necesitaría almacenar el tipo de columna (Clase) para una tabla en memoria.

Antes que nada, necesita algún tipo de controlador SessionScoped al que pueda guardar el estado de ordenación. Necesitará almacenar dos estados: ordenar columna y ordenar orden (ascendente/descendente).

En segundo lugar, vincule p: datatable a un objeto en su controlador ViewScoped (binding="#{viewController.datatable}") e implemente el getter y el setter básicos para él. En el método de la moda, tengo esto:

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

Los bits importantes son las líneas setValueExpression, el segundo parámetro del método createValueExpression requiere la expresión estilo JSF, es decir: #{pojo.stuff}. También observe cómo estoy usando Object.class como tipo, creo que puedo salirse con la tuya porque la tabla está cargada y estoy manejando toda la clasificación en la implementación de LazyDataModel.

En tercer lugar, añadir el evento de clasificación a la tabla de datos:

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

y el oyente en el controlador:

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

Eso es todo.

Cuestiones relacionadas