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;
}

メソッドに表示されているように、ページが読み込まれるたびに両方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)
4

1 に答える 1

0

Primefaces を使う場合は lazyLoading のようなオプションがあります。true を指定すると、クライアント側のものはすべてサーバー側で処理されます。詳細については

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

于 2013-02-27T04:54:24.743 に答える