簡體   English   中英

分頁后如何刷新數據表動態列

[英]How to Refresh Datatable Dynamic Columns After Pagination

我使用的是primefaces 3.1,並且有一個數據表來顯示分頁數據,其數據列是基於頁面數據構建的,並通過<p:columns/>標記進行呈現。 使用這種方法,同一數據表的不同頁可以具有不同的列。 我堅信默認情況下它將在分頁時重新渲染列,但事實並非如此。 我已經嘗試了<p:ajax event="page" update="myTable"/><p:ajax event="page" update="myTableContainer"/>碰碰運氣。

觸發分頁時,是否有一種方法可以重新呈現整個數據表,因此不僅可以正確顯示內容,而且可以正確顯示列標題?

編輯:這是您所要求的一些代碼示例。

我已經實現了自己的LazyDataModel實現,並對其進行了擴展,使其覆蓋了load方法的實現:

@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實現中的屬性以及它們對應的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>

ventoryMovementsBean.view是我的LazyDataModel實例,方法getOperationValue(item,stockOperation),getStartingQuantity(item,quantityType)和getEndingQuantity(item,quantityType)是為我提供給定項目和列的內容的方法。

我已經進行了調試,並且非常確定整個數據是否正確加載,這只是一個顯示問題。 以下是一些屏幕截圖,作為其他信息。

初始渲染分頁后的實際渲染分頁后的預期渲染

這些圖像對應於:

  • 初始渲染(第1頁)。
  • 分頁后的實際渲染(第3頁)
  • 分頁后的預期渲染效果(第3頁)

如果使用Primefaces,則有一個類似lazyLoading的選項。如果指定true,則所有客戶端的內容都將在服務器端處理。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM