11

のような反復コンポーネントから行を削除する際、最後のページの<p:dataTable>すべての行が削除されている場合、現在のページを直前のページにリセットする必要があります。残念ながら、これはwithでは自動化されていません。<p:dataTable>LazyDataModel<T>

言語的には、データ テーブルに 1 ページあたり 10 行の 11 ページが含まれており、11 ページ目のすべての行、つまり最後の行が削除されている場合、10 ページ目 (つまり、直前のページ) が自動的に取得されるはずですが、これは自動的には行われません。関連するバッキング Bean のどこかに明示的にコーディングされていない限り、(データ テーブル自体が空になるかのように、現在のページは固定 (11 番目) のままです)。

非形式的には、対応する擬似コード セグメントは次のようになります。

if (rowCount <= (ceiling)((first + 1) / pageSize) * pageSize - pageSize) {
    first -= pageSize;
}

はページオフセットfirst( で始まる0) で、pageSizeページあたりrowCountの行数を示し、関連するデータ ストア/データベースからの行の総数を示します。

特に :

@Override
public List<Entity> load(int first, int pageSize, List<SortMeta> multiSortMeta, Map<String, Object> filters) {

    // ...

    int rowCount = service.getRowCount();
    setRowCount(rowCount);

    // ...

    if (pageSize <= 0) {
        // Add an appropriate FacesMessage.
        return new ArrayList<Entity>();
    } else if (first >= pageSize && rowCount <= Utility.currentPage(first, pageSize) * pageSize - pageSize) {
        first -= pageSize;
    } else if (...) {
        // ...
    }

    // ...

    return service.getList(first, pageSize, map, filters);
    // SortMeta in List<SortMeta> is PrimeFaces specific.
    // Thus, in order to avoid the PrimeFaces dependency on the service layer,
    // List<SortMeta> has been turned into a LinkedHashMap<String, String>()
    // - the second last parameter (named "map") of the above method call.
}

静的ユーティリティ メソッドUtility#currentPage()は次のように定義されます。

public static int currentPage(int first, int pageSize) {
    return first <= 0 || pageSize <= 0 ? 1 : new BigDecimal(first + 1).divide(new BigDecimal(pageSize), 0, BigDecimal.ROUND_CEILING).intValue();
}

<p:dataTable>これはボイラープレート コードの一部であり、あらゆる場所 ( withを使用するすべてのマネージド Bean) で繰り返されることを避ける必要がありますLazyDataModel<T>

このプロセスを自動化する方法はありますか?

4

0 に答える 0