2013-02-26 91 views
0

我使用primefaces 3.1,我有一個數據表顯示分頁數據,其列基於頁面數據構建,並通過<p:columns/>標記呈現。採用這種方法,同一個數據表的不同頁面可以有不同的列。我想它會默認重新呈現分欄上的列,但事實並非如此。我試過<p:ajax event="page" update="myTable"/><p:ajax event="page" update="myTableContainer"/>運氣好。如何在分頁後刷新數據表動態列

有沒有辦法在觸發分頁時重新呈現整個數據表,所以不僅內容而且列標題都能正確顯示?

編輯:繼承人一些代碼示例,如您所請求。

香港專業教育學院做了我自己的實現LazyDataModel和擴展其覆蓋負載方法實現:

@Override 
public List<StockItem> load(int i, int i1, String string, SortOrder sortOrder, Map<String, String> map) { 
    List<StockItem> stockItems = super.load(i, i1, string, sortOrder, map); 
    inventoryMovements = service.listInventoryMovements(stockItems, fromDate, toDate); 
    stockOperations = new HashSet<StockOperation>(); 
    quantityTypes = new HashSet<QuantityType>(); 
    for (Map.Entry<StockItem, ItemMovements> entry : inventoryMovements.entrySet()) { 
     quantityTypes.addAll(entry.getValue().getStartingQuantities().keySet()); 
     quantityTypes.addAll(entry.getValue().getEndingQuantities().keySet()); 
     stockOperations.addAll(entry.getValue().getOperationsApplied().keySet()); 
    } 
    return stockItems; 
} 

當你的方法看,我在每一個頁面加載填補兩者stockOperationsquantityTypes。這兩個對應於我的實際頁面列。 (這是我LazyDataModel實施atributes與它們對應的getter)

<p:dataTable id="movementsTable" var="item" 
           value="#{inventoryMovementsBean.view}" 
           rowIndexVar="rowIndex" 
           paginator="true" 
           rows="25"> 
         <p:column headerText="Item"> 
          <h:outputText value="#{item.label}" /> 
         </p:column> 
         <p:columns value="#{inventoryMovementsBean.view.quantityTypes}" var="quantityType" columnIndexVar="quantityTypeIndex"> 
          <f:facet name="header"> 
           #{quantityType.description} 
          </f:facet> 
          <h:outputText value="#{inventoryMovementsBean.view.getStartingQuantity(item, quantityType)} => #{inventoryMovementsBean.view.getEndingQuantity(item, quantityType)}" /> 
         </p:columns> 
         <p:columns value="#{inventoryMovementsBean.view.stockOperations}" var="stockOperation" columnIndexVar="stockOperationIndex"> 
          <f:facet name="header"> 
           #{stockOperation.name} 
          </f:facet> 
          <h:outputText value="#{inventoryMovementsBean.view.getOperationValue(item, stockOperation)}" /> 
         </p:columns> 
        </p:dataTable> 

inventoryMovementsBean.view是我LazyDataModel實例和方法getOperationValue(項目,stockOperation),getStartingQuantity(項目,quantityType)和getEndingQuantity(項目,quantityType)是給我的內容給予一個項目和一列。

我已經做了一個調試,並且我很確定整個數據都是加載的,這只是一個顯示問題。以下是一些截圖作爲附加信息。

Initial render Actual render after pagination Expected render after pagination

這些圖像對應於:

  • 初始渲染(第1頁)。
  • 實際渲染分頁(第3頁)
  • 預計分頁後渲染(第3頁)之後
+0

是您的託管bean至少'@ ViewScoped',和您的數據保存你的''堅持在每一個新的頁面調用? – 2013-02-26 22:05:48

+0

是的。我的問題基本上是rerendereing列標題,頁面內容顯示爲所需 – Juan 2013-02-27 04:19:57

+0

我想如果你分享一個[SSCCE](http://sscce.org)你的代碼,以幫助你,這將是偉大的。 – 2013-02-27 04:56:09

回答

0

如果使用Primefaces,有沒有像lazyLoading.If指定true,那麼所有客戶端的選項東西會在服務器處理side.For更

http://www.primefaces.org/showcase/ui/datatableLazy.jsf

+1

它已經默認爲'false',整個設置在技術上與OP的具體問題無關。 – BalusC 2013-02-27 11:10:32