Frage

Ich habe ein heimeliges und sortierbares <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>

Die Daten werden vom Flash -Bereich in a erhalten @ViewScoped Bohne während der preRenderView Veranstaltung:

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

Wenn ich Pagination oder Sortierung durchführe, gehen die Daten verloren. Wie ist das verursacht und wie kann ich es lösen?

War es hilfreich?

Lösung

Sie scheinen zu denken, dass die preRenderView wird nur einmal während der Erstellung des View -Bereichs ausgeführt. Das ist falsch. Das preRenderView wird während jeder HTTP -Anfrage kurz vor der Ansicht (lesen Sie den Ereignisnamen noch einmal, es sollte jetzt sinnvoller sein, oder?). Pagination und Sortierung werden von Ajax durchgeführt. Jede AJAX -Anfrage wird auch als HTTP -Anfrage angesehen. Flash Scoped -Daten haben eine Lebensdauer von genau einer Umleitung. In allen nachfolgenden Anfragen sind Flaschanfragen nicht mehr verfügbar, es sei denn, es wird nicht mehr ausdrücklich im Flaschbereich eingestellt. Im Grunde genommen wird Ihre Hörermethode bei jeder Pagination und Sortieranforderung neu gestaltet, die effektiv festgelegt werden detalle zu null.

Loswerden <f:event> insgesamt und setzen a @PostConstruct Annotation zur Methode. Auf diese Weise wird es nur einmal während der Erstellung des View -Umfangs angerufen, genau wie Sie es beabsichtigt haben.

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

Siehe auch:


Nicht verwandt Für das konkrete Problem ist dieses Design ... irgendwie seltsam. Ich würde wirklich einen erfahreneren JSF -Architekten konsultieren, wie Sie die konkrete funktionale Anforderung ordnungsgemäß erreichen können, für die Sie möglicherweise fälschlicherweise dachten, dass die Verwendung des Flash -Bereichs auf diese Weise der richtige Ansatz wäre.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top