2014-09-01 56 views
0

我有一個可以用datascroller擴展的可擴展的richfaces。我們寫了一個自己的類來擴展ExtendeddataModel。Richfaces extendeddatatable和datascroller - 在頁面重置時的渲染順序

一切工作正常,直到以下情形:

  1. 轉到datascroller
  2. 使用,導致數據量較小的任何過濾器的最後一頁,所以最後的頁面不存在任何更

結果:datascroller「跳躍」到正確的頁面,但數據表仍顯示空

一些調試後我發現指出,「行走()」的ExtendeddataModel-實施的方法被調用之前datascroller寫入日誌:

The requested page isn't found in the model. Paging is reset to page... 

我們使用篩選,排序,推送機制的新數據......這樣一種複雜的環境,我不能在這裏發佈,但我試圖指出最重要的部分。

<h:selectManyCheckbox value=#{controller.filter}> 
    <f:selectItems value="#{controller.filterOptions} /> 
    <a4j:ajax render="table scroller" /> 
</h:selectManyCheckbox 

<rich:extendeddatatable id="table" ... /> 

<rich:dataScroller for="table" id="scroller" renderIfSinglePage="false" 
    page="#{controller.page}" 

向datascroller添加render =「table」沒有幫助。唯一有幫助的是將渲染放入兩個不同的請求中,所以首先只渲染datascroller,然後渲染數據表。

有沒有辦法做到這一點沒有2請求?我能強制渲染命令嗎?或者我只是在dataScroller/datatable的配置中錯過了一些東西,在滾動器重置後呈現它...

回答

0

我能夠通過在java代碼中手動重置頁面來解決此問題。在Extendeddatamodel的

具體我改變行走(...)方法是這樣的:

@Override 
public void walk(FacesContext context, DataVisitor visitor, 
    Range range, Object argument){ 

    SequenceRange sequenceRange = (SequenceRange) range; 

    int firstRow = sequenceRage.getFirstRow(); 
    int rows = myDB.getCount(); 

    if(firstRow > rows){ 
     int fullPages = rows/ROWS_PER_PAGE; 
     int rest = rows % ROWS_PER_PAGE; 

     if(rest == 0){ 
      firstRow = rows - ROWS_PER_PAGE; 
      this.setPage(fullPages); 
     }else{ 
      firstRow = rows - rest; 
      this.setPage(fullPages + 1); 
     } 
    } 

... 
// visitor.process(...); stuff 
... 

} 

我還是相信的是正是這種東西normaly的datascroller本身應該做的,但至少我現在的問題是,解決了。