2013-02-21 68 views
2

我正在爲我的Web UI項目使用PrimeFaces UI庫。爲什麼第一次啓動對話框時會創建兩次backing bean?

我有一個manage_watchfolder.xhtml頁,有一個按鈕,這個按鈕啓動一個對話框:

<p:commandButton value="Add" oncomplete="dlgEditWF.show()" update=":editWFForm"> 
    <f:param value="#{item.value.ID}" name="editId"/> 
    <h:graphicImage value="./edit.png" /> 
</p:commandLink> 

這裏面相同的文件我有dlgEditWFedit_watchfolder.xhtml包括:

<p:dialog id="editDialog" widgetVar="dlgEditWF" dynamic="true"> 
    <ui:include src="edit/edit_watchfolder.xhtml"/> 
</p:dialog> 

我使用dynamic=="true"以防止點擊按鈕之前加載edit_watchfolder.xhtml

editWFFormedit_watchfolder.xhtml中的一種形式。

問題是,當我啓動第一個對話框時,edit_watchfolder.xhtml支持bean(請求作用域)被創建兩次。第一次通過editId(見上面的代碼)傳遞的值是可以的,但第二次它不在那裏,所以輔助bean得到錯誤的值。

當我回到(OKCancel按鈕)到父頁面並再次啓動對話框後,問題消失了,一切正常。這個問題似乎只是第一次啓動。

爲什麼第一次啓動對話框時會創建兩次backing bean?

+0

也許這有助於:http://stackoverflow.com/questions/4826377/jsf-backing-bean-constructor-called-multiple-times – 2013-02-21 12:22:02

回答

1

我懷疑這是因爲Primefaces dynamic功能的工作原理。

commandButton的第一個請求將發送帶有editID的請求參數以加載。發生此請求後,收到響應並更新頁面元素後,會出現oncomplete javascript,顯示對話框。

一旦顯示對話框一個完全不同的請求發生動態載荷的對話框中的內容,但這次沒有editID參數。您的bean是@RequestScoped,因此它正在創建兩次,第二次它不保留editID請求參數。

有三種可能的解決方案:

  1. 從你的對話框

  2. 更改你的bean取出dynamic屬性@ViewScoped@SessionScoped

  3. 將editID請求參數更改爲@SessionScoped受管bean中的bean屬性。

+1

謝謝。如果不是'oncomplete',我會使用'onstart'來解決問題。在這種情況下,對話框會立即顯示 - 但是爲空 - 然後在一兩秒鐘後,它會使用ajax更新爲適當的值。所以,'onclick'的作品,但用戶體驗是非常糟糕的。 – Danijel 2013-02-21 13:04:59

1

原因是因爲第一次打開對話框發送AJAX請求來加載實際內容。這裏唯一合理的是使用@ViewScoped bean來處理這兩個請求:第一個被commandButton觸發,第二個被dlgEditWF.show()觸發。當然,如果你刪除dynamic="true"只會有一個請求。

相關問題