1

我使用 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>

inventoryMovementsBean.view 是我的 LazyDataModel 实例,getOperationValue(item, stockOperation)、getStartingQuantity(item, quantityType) 和 getEndingQuantity(item, quantityType) 方法是给定项目和列的内容。

我已经进行了调试,我很确定整个数据都正确加载了,这只是一个显示问题。以下是一些屏幕截图作为附加信息。

初始渲染 分页后的实际渲染 分页后的预期渲染

这些图像对应于:

  • 初始渲染(第 1 页)。
  • 分页后的实际渲染(第3页)
  • 分页后的预期渲染(第3页)
4

1 回答 1

0

如果你使用 Primefaces,有一个选项,比如lazyLoading。如果你指定 true,那么所有客户端的东西都将在服务器端处理。更多

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

于 2013-02-27T04:54:24.743 回答