2013-03-04 15 views
10

Próbuję zaimplementować multisort na datacable Primeface. Używamy Primefaces v3.5. Stworzyłem nową metodę ładowania w LazyLoadClass, która pobiera parametr Lista SortMeta>.Początkowy porządek sortowania dla danych PrimeFaces z multisortem

Ale mam problemy z początkowym obciążeniem tabeli. Lista SortMeta> ma wartość NULL po wywołaniu metody load. Próbowałem również bez określenia początkowego sortBy i sortOrder dla datatable. W obu przypadkach wynik jest taki sam.

Widząc, że mamy nową klasę SortMeta do obsługi multisort, podejrzewam, że sposób na określenie początkowego pola sortowania i porządku również się zmienił. Ale nie mogłem znaleźć żadnego przykładu, aby wskazać różnicę. Instrukcja 3.5 nie wspomina o żadnej różnicy.

Dlaczego możemy uzyskać listę SortMeta> jako zerową? Jakieś wskazówki na przykładowym kodzie, gdzie multisort jest używany z Lazyload?

+0

Należy podać listę SortMeta do sortowania. –

+0

OK. Wcześniej podawaliśmy ciąg nazwy kolumny, ale teraz, jak rozumiem, powiązaliśmy go z obiektem listy na fasoli. Dzięki! Wypróbuję to. –

+0

@CagatayCivici Próbowałem '' i mam utworzony preSortOrder jako 'private void buildSortOrder() { SortMeta sm1 = new SortMeta(); \t \t sm1.setSortField ("resolvedDateTime"); m1.setSortOrder (SortOrder.DESCENDING); preSortOrder.add (sm1); \t \t \t } 'ale NPE wyrzucane BCS encodeColumnHeader Sposób DataTableRenderer korzysta UIColumn jako' sortIcon = resolveDefaultSortIcon (columnSortByVe, meta.getColumn(). GetValueExpression sortby ("") (meta.getSortOrder). Nazwa()); ' –

Odpowiedz

18

Udało mi się to uruchomić.

Zasadniczo musimy dostarczyć UIColumn w obiekcie SortMeta, aby działał. Dla początkowego sortowania w czasie renderowania musiałem znaleźć komponent w moim komponencie bean i przypisać go do sortMeta.

Poniżej jest mój kod w widoku 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> 

Oto mój kod fasoli wezwał @PostConstruct

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

nie jestem pewien, że to dobry sposób, żeby to zrobić, ale to Prace. Zazwyczaj czuję się niekomfortowo, gdy musimy używać identyfikatorów z widoku w kodzie bean, ponieważ może to powodować błędy, gdy ludzie nie są ostrożni.

Dzięki @CagatayCivici za szybką wskazówkę.

+1

Dokładnie, przykro mi, nie miałem czasu na dostarczenie pełnej próbki, więc mogłem podać tylko wskazówkę. Dziękuję za udostępnienie szczegółowego przykładu. –