2016-05-12 67 views
1

我有:Primefaces PAGINATE懶惰的DataTable不計排

在我的豆
    <p:dataTable id="myTable" lazy="true" widgetVar="myTable" value=".." paginator="true" paginatorPosition="bottom" rows="10" ...> 
        <p:ajax event="page" oncomplete="myTable" /> 
        ... 
        </p:dataTable> 

    ... 
        private LazyDataModel list; 
        ...      
        public void search() { 
         list = new LazyDataModel<SomeDTO>() { 
          private static final long serialVersionUID = 1L; 
          List<SomeDTO> result = null; 

          @Override 
          public List<SomeDTO> load(int first, int pageSize, String sortField, SortOrder sortOrder, Map<String, Object> filters) {          
           List<SomeDTO> result = service.search(searchedName, first, pageSize); 
           // SOME CODE HERE FOR PAGINATION ?? BUT WHAT 
           return result; 
          } 

         }; 
         // HOW TO DELETE THIS EXTRA REQUEST 
         list.setRowCount(service.search(searchedName)); 
        } 

我的問題是如何從結果(大小+ 1)setRowCount。我不想從數據庫中獲取數據,因爲我確信我們可以在不請求數據庫的情況下計算rowCount。

回答

-1

好吧,我明白了。 先在你的頁面,你需要這樣的:

    <p:remoteCommand name="updateMyTable" update="#{p:component('myTable')}" process="@this" /> 
        <p:dataTable id="myTable" lazy="true" widgetVar="myTable" value=".." paginator="true" paginatorPosition="bottom" rows="10" ...> 
        <p:ajax event="page" oncomplete="updateMyTable()" /> 
        ... 
        </p:dataTable> 

在bean改變負載的方法是這樣的:

      @Override 
          public List<SomeDTO> load(int first, int pageSize, String sortField, SortOrder sortOrder, Map<String, Object> filters) {          
           List<SomeDTO> result = service.search(searchedName, first, pageSize); 
           if (first <= pageSize) { 
            this.setRowCount(this.getRowCount() + result.size() + 1); 
           } else if (result != null && result.size() > 0 && (result.size() >= pageSize)) { 
            this.setRowCount(this.getRowCount() + result.size()); 
           } 
           return result; 
          } 
+0

這會更新數據表。兩次。查詢被執行兩次...不是我想的。 – Kukeltje

+0

不管先生何先生都知道,在判斷人員之前,先閱讀問題和解決方案。顯然,你不知道primefaces數據表的懶惰加載和它是如何工作的! –

+0

首先,我不是在判斷人,我在判斷答案。雖然它可能在技術上有效,但它不是一個有效的解決方案,也不是必需的。顯而易見你說的是閱讀答案。 **我是創建了我接受的PrimeFaces補丁的人,你注意到了嗎?**我在論壇和舊版本的發行者中爲PrimeFaces數據表提供了多項其他改進建議,包括嵌套在數據表中重複一遍。我有那些在我的環境中工作了很長時間,所以我知道**延遲加載**。所以請在判斷人員之前直接獲取記錄** – Kukeltje

-1

Primefaces分頁懶惰的DataTable需要兩個查詢,查詢返回一個頁面的結果作爲限制,另一個查詢知道數據的總大小。

+1

這兩個查詢是沒有必要的,我們可以計算頁數動態地從我們的服務返回列表的大小+ 1, 這個解決方案的優點是我們不必複製服務方法從db獲取計數,特別是對於非常複雜的搜索查詢。 –

2

PrimeFaces不支持開箱即用。 A fix has been checked in to trunk on Feb 11th 2016, tagged 6.0(所以它應該至少在目前的6.0RCx版本中)。我不確定它是否在Elite版本中> = 5.2.20或> = 5.3.7(從2月12日開始)

這種不工作的一個重要原因是更新後的rowCount可能會在負載方法服務器端是而不是應用於分頁程序客戶端。但是,由於從服務器傳輸到客戶端,因此您可以在每個ajax調用的完成時更新它。實際上,這是patch的很大一部分(另一部分是從ajax響應中讀取值)。

結合在例如一個AJAX頁面事件的onComplete將解決這一問題:

function updatePaginator(xhr, status, args) { 
    var paginator = PF('DataTableWidgetVar').paginator; 
    paginator.cfg.rowCount=args.totalRecords; 
    paginator.cfg.pageCount = Math.ceil(value/paginator.cfg/rows)||1; 
    paginator.updateUI(); 
} 

然後,您可以在load方法每次調用, - 嘗試閱讀頁面大小+ 1點的記錄 - 設置計數到這一點,如果你可以閱讀pageSize + 1(但仍返回pageSize記錄) - 將計數設置爲讀取的行數(如果它們的頁面大小爲或更小)。

+0

如果你看我的解決方案,我有:此命令在ajax頁面後重新刷新數據表。我已經測試過它,它完美的工作。 如果你不確定在你的答案不要發佈它。 –

+0

有兩個請求p:ajax頁面事件和其他p:remoteCommand。但這不是問題。我的問題是避免請求數據庫獲取計數行不可數據。 –

+0

這是與p:remoteCommand負載數據表的另一個問題是執行兩次..你知道如何刷新數據表沒有p:remoteCommand我試過update =「datatable」,但不工作? –