2013-03-04 24 views
10

Tôi đang cố gắng triển khai multisort trên Primeface datatable. Chúng tôi đang sử dụng Primefaces v3.5. Tôi đã tạo một phương thức tải mới trong LazyLoadClass lấy tham số List of SortMeta>.Sắp xếp thứ tự ban đầu cho PrimeFaces có thể định dạng với multisort

Nhưng tôi gặp sự cố trong tải ban đầu của bảng. Danh sách SortMeta> là null khi phương thức tải được gọi. Tôi cũng đã thử mà không chỉ định sortBy ban đầu và sortOrder cho datatable. Trong cả hai trường hợp, kết quả là như nhau.

Thấy rằng chúng tôi có lớp SortMeta mới này để hỗ trợ đa nhóm, tôi nghi ngờ rằng cách để chỉ định trường sắp xếp ban đầu và thứ tự cũng sẽ thay đổi. Nhưng tôi không thể tìm thấy bất kỳ ví dụ nào ở đâu để chỉ ra sự khác biệt. Hướng dẫn 3.5 không đề cập đến bất kỳ sự khác biệt nào.

Tại sao chúng tôi có thể lấy Danh sách SortMeta> là rỗng? Bất kỳ con trỏ trên mã ví dụ nơi multisort được sử dụng với Lazyload?

+0

Bạn cần cung cấp danh sách SortMeta để sắp xếpBởi. –

+0

OK. Trước đó chúng tôi đã đưa ra String của tên cột, nhưng bây giờ, như tôi hiểu, chúng tôi đã ràng buộc nó vào một đối tượng List trên bean. Cảm ơn! Sẽ thử điều này. –

+0

@CagatayCivici Tôi đã thử '' và tôi có đã tạo preSortOrder là 'private void buildSortOrder() { SortMeta sm1 = new SortMeta(); \t \t sm1.setSortField ("resolveDateTime"); m1.setSortOrder (SortOrder.DESCENDING); preSortOrder.add (sm1); \t \t \t } 'nhưng một NPE được ném bcs phương thức encodeColumnHeader trong DataTableRenderer đang truy cập UIColumn dưới dạng' sortIcon = resolveDefaultSortIcon (columnSortByVe, meta.getColumn(). GetValueExpression ("sortBy"), meta.getSortOrder(). Name()); ' –

Trả lời

18

Tôi có thể làm việc này.

Về cơ bản, chúng tôi cần cung cấp UIColumn trong đối tượng SortMeta để nó hoạt động. Đối với sắp xếp ban đầu tại thời gian render, tôi đã phải tìm thành phần trong bean của tôi và gán nó cho sortMeta.

Dưới đây là mã của tôi trong giao diện 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> 

Dưới đây là mã đậu của tôi kêu gọi @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);   
    } 

Tôi không chắc chắn này là đúng cách để làm điều này, nhưng nó công trinh. Tôi thường không thoải mái khi chúng ta phải sử dụng các id từ xem trong mã bean, vì nó có thể đưa ra các lỗi khi mọi người không cẩn thận.

Cảm ơn @CagatayCivici vì gợi ý nhanh.

+1

Chính xác, xin lỗi tôi không có thời gian để cung cấp mẫu đầy đủ để chỉ có thể cung cấp mẹo. Cảm ơn bạn đã chia sẻ một ví dụ chi tiết. –

Các vấn đề liên quan