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
これら2つは、私の実際のページ列に対応しています。(これらは、対応するゲッターを使用したLazyDataModel実装の属性です)
<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)