2013-02-26 7 views
0

J'utilise les primaux 3.1 et j'ai une datatable qui montre les données paginées, dont les colonnes sont construites en fonction des données de la page et rendues par l'intermédiaire de la balise <p:columns/>. Avec cette approche, différentes pages du même datatable peuvent avoir différentes colonnes. Je pensais que cela rendrait les colonnes sur la pagination par défaut, mais ce n'est pas le cas. J'ai essayé <p:ajax event="page" update="myTable"/> et <p:ajax event="page" update="myTableContainer"/> avec un peu de chance.Comment rafraîchir les colonnes dynamiques datables après la pagination

Existe-t-il un moyen de rendre de nouveau le datatable entier lorsque la pagination est déclenchée, donc non seulement le contenu mais les en-têtes de colonne sont affichés correctement?

Édition: Utilise un échantillon de code comme vous l'avez demandé.

Ive fait ma propre mise en œuvre de LazyDataModel et l'a étendu redéfinissant la mise en œuvre de la méthode de charge:

@Override 
public List<StockItem> load(int i, int i1, String string, SortOrder sortOrder, Map<String, String> map) { 
    List<StockItem> stockItems = super.load(i, i1, string, sortOrder, map); 
    inventoryMovements = service.listInventoryMovements(stockItems, fromDate, toDate); 
    stockOperations = new HashSet<StockOperation>(); 
    quantityTypes = new HashSet<QuantityType>(); 
    for (Map.Entry<StockItem, ItemMovements> entry : inventoryMovements.entrySet()) { 
     quantityTypes.addAll(entry.getValue().getStartingQuantities().keySet()); 
     quantityTypes.addAll(entry.getValue().getEndingQuantities().keySet()); 
     stockOperations.addAll(entry.getValue().getOperationsApplied().keySet()); 
    } 
    return stockItems; 
} 

Comme vous le voyez dans la méthode, je remplis à la fois stockOperations et quantityTypes sur chaque chargement de page. Ces deux correspondent à mes colonnes de page réelles. (Ce sont atributs dans ma mise en œuvre de LazyDataModel avec leurs apporteurs correspondants)

<p:dataTable id="movementsTable" var="item" 
           value="#{inventoryMovementsBean.view}" 
           rowIndexVar="rowIndex" 
           paginator="true" 
           rows="25"> 
         <p:column headerText="Item"> 
          <h:outputText value="#{item.label}" /> 
         </p:column> 
         <p:columns value="#{inventoryMovementsBean.view.quantityTypes}" var="quantityType" columnIndexVar="quantityTypeIndex"> 
          <f:facet name="header"> 
           #{quantityType.description} 
          </f:facet> 
          <h:outputText value="#{inventoryMovementsBean.view.getStartingQuantity(item, quantityType)} => #{inventoryMovementsBean.view.getEndingQuantity(item, quantityType)}" /> 
         </p:columns> 
         <p:columns value="#{inventoryMovementsBean.view.stockOperations}" var="stockOperation" columnIndexVar="stockOperationIndex"> 
          <f:facet name="header"> 
           #{stockOperation.name} 
          </f:facet> 
          <h:outputText value="#{inventoryMovementsBean.view.getOperationValue(item, stockOperation)}" /> 
         </p:columns> 
        </p:dataTable> 

inventoryMovementsBean.view est mon exemple de LazyDataModel et les méthodes getOperationValue (point, stockOperation), getStartingQuantity (point, quantityType) et getEndingQuantity (point, quantityType) sont ceux qui me donnent le contenu donné un article et une colonne. J'ai déjà fait un débogage, et je suis assez sûr que toutes les données sont chargées proprement, c'est juste un problème d'affichage. Voici quelques captures d'écran en tant qu'informations supplémentaires.

Initial render Actual render after pagination Expected render after pagination

Ces images correspondent à:

  • rendu initial (Page 1).
  • réelle après render pagination (Page 3)
  • render prévue après la pagination (Page 3)
+0

est-bean géré au moins '@ ViewScoped', et vos données pour tenir votre' ' persistent sur chaque nouvel appel de la page? –

+0

Oui, c'est. Mon problème est fondamentalement avec rerendereing en-têtes de colonne, le contenu de la page est affiché comme souhaité – Juan

+0

Je suppose que ce serait génial pour nous si vous partagez un [SSCCE] (http://sscce.org) de votre code afin de vous aider. –

Répondre

0

Si vous utilisez Primefaces, il y a une option comme lazyLoading.If vous spécifiez vrai, tout le côté client la substance sera traitée dans le serveur side.For plus

http://www.primefaces.org/showcase/ui/datatableLazy.jsf

+1

Il est par défaut 'false' déjà et tout le réglage n'a techniquement rien à voir avec le problème concret d'OP. – BalusC

Questions connexes