1

私はページング可能でソート可能<p:dataTable>です:

<p:dataTable var="item" value="#{reporteIngresosPorExtranetController.detalle}"
    paginator="true" rows="10" paginatorPosition="bottom" rowsPerPageTemplate="5,10,15"
    paginatorTemplate="{CurrentPageReport} {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}">
    <p:column sortBy="#{item.user}" headerText="USUARIO:">
        <h:outputText value="#{item.user}" />
    </p:column>
    ...
</p:dataTable>

そのデータは、イベント中にフラッシュ スコープから@ViewScopedBean に取得されます。preRenderView

<f:event type="preRenderView" listener="#{reporteIngresosPorExtranetController.cargarDatos}" />
public void cargarDatos() {
    detalle = (List<Map<String, Object>>) FacesUtils.flashScope().get("RIE_detalle");
}

ページネーションまたはソートを実行すると、データが失われます。これはどのように発生し、どうすれば解決できますか?

4

1 に答える 1

0

preRenderViewビュー スコープの作成中に が 1 回だけ実行されると考えているようです。これは間違っています。は、ビューをレンダリングする直前にすべてpreRenderViewの HTTP リクエスト中に実行されます (イベント名をもう一度読んでください。より意味のあるものになるはずですよね?)。ページネーションとソートは ajax によって実行されます。すべての ajax リクエストも HTTP リクエストと見なされます。Flash スコープのデータの有効期間は、リダイレクトが 1 回だけです。Flash スコープで再度明示的に設定しない限り、Flash スコープのデータは後続のすべてのリクエストで使用できなくなります。したがって、基本的に、リスナーメソッドは、実質的にに設定されるすべてのページネーションおよび並べ替えリクエストで再度呼び出されます。detallenull

<f:event>を完全に取り除き@PostConstruct、メソッドに注釈を付けます。このようにして、意図したとおりに、ビュースコープの作成中に実際に1回だけ呼び出されます。

@PostConstruct
public void cargarDatos() {
    detalle = (List<Map<String, Object>>) FacesUtils.flashScope().get("RIE_detalle");
}

以下も参照してください。


具体的な問題とは関係ありませんが、このデザインは...ちょっと奇妙です。この方法でフラッシュスコープを使用することが正しいアプローチであると誤って考えた可能性がある具体的な機能要件を適切に達成する方法について、経験豊富なJSFアーキテクトに相談したいと思います。

于 2013-11-07T16:40:56.923 に答える