2017-02-11 45 views
1

我需要從我的支持bean中執行三個彼此相互作用的動作,但第二個和第三個動作似乎在第一個動作完成執行之前被觸發。從bean中依次更新JSF組件

結果是第二個/第三個動作被調用但沒有執行。

我該如何設法執行第一個動作,等到完成並開始第二個/第三個動作?

動作是

  1. 關閉模態對話框窗口。這需要一秒鐘才能執行渲染。

RequestContext.getCurrentInstance()執行( 「PF( 'dlgConfirmApplicationDelete')隱藏();」)。

  • 更新面板h:panelGroup部件
  • RequestContext.getCurrentInstance()更新( 「j_idt3:panelGroupHolder」);

  • 更新的第二面板h:panelGroup部件
  • RequestContext.getCurrentInstance()更新。( 「j_idt3:center_westBody」);

    +0

    爲什麼不使用一個單獨的方法與布爾訪問或類似這樣? –

    +0

    你是否在等待用戶確定執行第二個動作?!? –

    +0

    不等待用戶。在用戶點擊對話窗口上的按鈕後,我需要在數據庫中執行一個操作,根據結果,我需要關閉窗口,並在更新其他兩個panelGroup後使用更新的信息。 – Neliosam

    回答

    3

    我需要執行數據庫中的作用,取決於 結果我需要關閉該窗口,右後更新的信息更新其他兩個 panelGroups

    你可以不用從java代碼調用動作就可以做到這一點

    不知道您的精確佈局,你所要求的任務通常會是這樣的:

    <p:commandLink 
        process="@form" 
        actionListener="#{bean1.updateDatabase}" 
        update="j_idt3:panelGroupHolde;j_idt3:center_westBody" 
        oncomplete="if (args.updateSuccessfull) PF('dlgConfirmApplicationDelete').hide();"> 
    

    和你bean1.updateDatabase方法裏面,你根據查詢的實際結果來確定args.updateSuccessfull

    Boolean updateSuccessfull = false; 
    RequestContext.getCurrentInstance().addCallbackParam("updateSuccessfull", updateSuccessfull); 
    

    在你提到的順序的例子並不重要,因爲每個動作都會有它的預定結果,並致力於在生命週期中的規定相(更新總是前的onComplete):

    • 如果更新查詢失敗,數據不會更改,因此update=不會有任何影響,並且由於CallBack-Param,對話框保持可見。
    • 如果更新查詢有效,數據確實會更改,兩個UI元素都會更新(其順序無關緊要),並且由於CallBack-Param的原因,對話框將被隱藏。

    如果不是這種情況,那麼你有RenderResponse -PHASE,它更應被在InvokeApplication -PHASE(或更早)執行的內部代碼。

    使後一個常見misstake是調用從XHTML「含有重碼方法」(而其他物品(「第二更新」)依賴於值以及),像

    <ui:repeat values="#{bean1.queryDatabaseForXY()}" ...>

    顯然現在第二次更新需要在第一次更新之後,因爲它還需要來自bean1.queryDatabaseForXY()的一些數據。

    不是,你應該在適當的階段進行數據加載和/或計算和簡單地指的是getter生成響應時返回一個已知的集合:

    <ui:repeat values="#{bean1.getUsers()}" ...> 
    

    或多個precicesly

    <ui:repeat values="#{bean1.users}" ...> 
    

    (實際加載可能是@PostConstruct,<f:viewAction>或只是視圖或會話範圍內的bean已存在的列表)

    +0

    嗨Dognose!非常感謝分享這個解決方案。 Primefaces真的很有趣!使用這些強大的功能使得編碼更加簡單。 – Neliosam