2013-03-04 11 views
10

Ich versuche Multisort auf Primeface Datentabelle zu implementieren. Wir verwenden Primefaces v3.5. Ich habe eine neue Lade-Methode in der LazyLoadClass erstellt, die den Parameter List of SortMeta> verwendet.Initialsortierung für PrimeFaces Datatable mit Multisort

Aber ich habe Probleme in der Anfangslast der Tabelle. Die Liste von SortMeta> ist null, wenn die load-Methode aufgerufen wird. Ich habe auch versucht, ohne die anfängliche sortBy und sortOrder für die Datentabelle zu spezifizieren. In beiden Fällen ist das Ergebnis dasselbe.

Da wir diese neue Klasse SortMeta zur Unterstützung von Multisort haben, vermute ich, dass sich auch die Art und Weise geändert hat, das anfängliche Sortierfeld und Reihenfolge anzugeben. Aber ich konnte nirgends ein Beispiel finden, um auf den Unterschied hinzuweisen. Das Handbuch 3.5 erwähnt keinen Unterschied.

Warum könnten wir die Liste von SortMeta> als null erhalten? Irgendwelche Zeiger auf Beispielcode, wo Multisort mit Lazyload verwendet wird?

+0

Sie müssen eine Liste von SortMeta zu sortBy bereitstellen. –

+0

OK. Früher haben wir die Zeichenfolge mit dem Namen der Spalte angegeben, aber jetzt, wie ich es verstehe, binden wir sie an ein List Objekt auf der Bean. Vielen Dank! Werde es ausprobieren. –

+0

@CagatayCivici Ich probierte '' und ich habe erstellt preSortOrder als 'private void buildSortOrder() { SortMeta sm1 = neu SortMeta(); \t \t sm1.setSortField ("resolvedDateTime"); m1.setSortOrder (SortOrder.DESCENDING); preSortOrder.add (sm1); \t \t \t } 'sondern ein NPE ist bcs die Methode encodeColumnHeader in DataTableRenderer geworfen zugreift UIColumn wie' sortIcon = resolveDefaultSortIcon (columnSortByVe, meta.getColumn(). GetValueExpression ("sortBy"), meta.getSortOrder(). Name()); ' –

Antwort

18

Ich konnte dies zur Arbeit bringen.

Im Wesentlichen müssen wir die UIColumn im SortMeta-Objekt bereitstellen, damit es funktioniert. Für die anfängliche Sortierung zur Renderzeit musste ich die Komponente in meiner Bean finden und diese der sortMeta zuweisen.

Unten ist mein Code in der Ansicht Xhtml

 <p:dataTable id="transDataTable" var="trans" 
     value="#{myBean.transModel}" paginator="true" rows="50" 
     paginatorAlwaysVisible="false" lazy="true" 
     sortMode="multiple" sortBy="#{myBean.preSortOrder}" 
     resizableColumns="true"> 

     <p:column headerText="User" sortBy="#{trans.user.name}" > 
      #{trans.user.name} 
     </p:column> 
     <p:column headerText="Company" sortBy="#{trans.companyName}"> 
      #{trans.companyName} 
     </p:column> 
     <p:column headerText="Join Date" id="joinDateTime" 
      sortBy="#{trans.joinDateTime}" > 
      <h:outputText value="#{trans.joinDateTime}" /> 
     </p:column> 
    </p:dataTable> 

Hier ist mein Bean-Code auf @PostConstruct genannt

 /* 
    * method to build initial sort order for multisort 
    */ 
    private void buildSortOrder() { 
     UIViewRoot viewRoot = FacesContext.getCurrentInstance().getViewRoot(); 
     UIComponent column = viewRoot.findComponent("transDataTable:joinDateTime"); 

     SortMeta sm1 = new SortMeta(); 
     sm1.setSortBy((UIColumn)column); 
     sm1.setSortField("joinDateTime"); 
     sm1.setSortOrder(SortOrder.DESCENDING); 
     preSortOrder.add(sm1);   
    } 

Ich bin nicht sicher, ob dies der richtige Weg ist, dies zu tun, aber es funktioniert. Ich bin normalerweise unbehaglich, wenn wir die IDs aus dem View im Bean-Code verwenden müssen, da dies zu Fehlern führen kann, wenn Leute nicht vorsichtig sind.

Danke @CagatayCivici für den schnellen Hinweis.

+1

Genau, Entschuldigung, ich hatte keine Zeit, eine volle Probe zur Verfügung zu stellen, also konnte nur ein Tipp zur Verfügung stellen. Danke, dass Sie ein detailliertes Beispiel gegeben haben. –

Verwandte Themen