簡體   English   中英

來自的數據 <p:dataTable> 當執行分頁或排序時,從preRenderView事件期間的Flash作用域獲取的數據丟失

[英]Data from <p:dataTable> which is obtained from flash scope during preRenderView event is lost when pagination or sorting is performed

我有一個可分頁和可排序的<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>

preRenderView事件期間,其數據是從Flash作用域獲取到@ViewScoped bean中的:

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

當我執行分頁或排序時,數據將丟失。 這是怎么引起的,我該如何解決?

您似乎認為preRenderView在創建視圖范圍期間僅執行一次。 錯了 preRenderView每個 HTTP請求期間在呈現視圖之前執行(再次讀取事件名稱,現在應該更有意義了吧?)。 分頁和排序由ajax執行。 每個ajax請求也被視為一個HTTP請求。 Flash作用域數據的生存期僅為一次重定向。 除非再次在flasch范圍中明確設置,否則Flash范圍的數據將無法在所有后續請求中使用。 因此,基本上,每個分頁和排序請求都會重新調用您的偵聽器方法,從而有效地將detalle設置為null

完全擺脫<f:event>並在方法上放置@PostConstruct批注。 這樣,它實際上僅在您創建視圖范圍期間被調用一次,完全符合您的意圖。

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

也可以看看:


具體問題無關 ,這種設計有點奇怪。 我真的會向經驗豐富的JSF架構師咨詢有關如何正確實現具體功能要求的信息,您可能會錯誤地認為以這種方式使用Flash范圍是正確的方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM