我使用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;
}
正如您在方法中看到的那样,我会在每次加载页面时同时填充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)是给出给定项目和列的内容的那些。
我已经进行了调试,而且我非常确定整个数据都是属性加载的,这只是一个显示问题。以下是一些截图作为附加信息。
这些图像对应于:
答案 0 :(得分:0)
如果你使用Primefaces,有一个像lazyLoading这样的选项。如果你指定为true,那么所有客户端的东西都将在服务器端处理。更多