我使用 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;
}
正如您在该方法中看到的那样,我stockOperations
在quantityTypes
每个页面加载时都填写。这两个对应于我的实际页面列。(这些是我的 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页)