2011-02-09 179 views
1

我在處理我的應用程序的範圍時非常困難。從視圖初始化託管Bean

我正在使用Primefaces使用我的初始視圖佈局。在佈局之外,我有許多不同的託管bean使用的對話框。

在我的佈局中,我有一個頁眉,頁腳左邊的navgiation,然後是中心的當前視圖。所以,我的看法如下所示:

<h:body id=body"> 
    <p:layoutUnit id=head" position="top"> 
     <ui:insert name="header"> 
    </p:layoutUnit> 
    <p:layoutUnit id=head" position="bottom"> 
     <ui:insert name="footer"> 
    </p:layoutUnit> 
    <p:layoutUnit id=head" position="left"> 
     <ui:insert name="menu"> 
    </p:layoutUnit> 
    <p:layoutUnit id=head" position="right"> 
     <ui:insert name="main"> 
    </p:layoutUnit> 

    <p:dialog widgetVar="addAddressDialog" header="Add New Address"> 
     <h:form id="insertAddress"> 
      <h:inputText id="insert_address" label="Address" /> 
     </h:form> 
    </p:dialog> 

    <p:dialog widgetVar="updateAddressDialog" header="Add New Address"> 
     <h:form id="updateAddress"> 
      <h:inputText id="update_address" value=#{addressBean.selectedAddress.address" /> 
     </h:form> 
    </p:dialog> 

我遇到的問題是,當我的應用程序首先加載addressBean的@PostConstruct獲取調用,因爲該視圖被加載。在@PostConstruct中,我初始化與名爲contactId的特定ID關聯的地址列表。此時雖然contactId沒有被實例化。一旦用戶與「主」視圖交互,就會發生這種情況。

我的範圍爲addressBean目前@ViewScope工作發現,但只有第一次contactId設置。之後,即使contactId更改,它仍繼續保留填充的信息,因爲@PostConstruct不會再次被調用,並且視圖永遠不會超出範圍。

我已經嘗試過@RequestScope,這個工程其實非常好。但是,當在「主」視圖內的數據表中顯示地址時,我遇到了一個問題。我在我的數據表底部有一個叫做insertAddressDialog.show()的按鈕。它第一次打開,我可以插入數據,但是1.數據表的視圖從不顯示我插入的新記錄,因爲我猜這個視圖已經丟失了。並且2. datable上的按鈕不再處於活動狀態或活動狀態,因此在第一次用戶插入記錄後對話框不會打開。

這似乎是這應該是一件容易的事情,但我的應用程序有很多嵌套的意見是導致問題。任何關於如何處理這種事情的見解都會幫助你。

回答

0

這聽起來不像PrimeFaces問題。

只要您不離開與其關聯的頁面(視圖),ViewScoped bean將保持在範圍內。 RequestScoped bean將在每次與它進行交互時重新實例化。如果您試圖在一次交互中將變量存儲到RequestScoped bean中,那麼在第二次交互時使用這些變量更新數據庫,第二次交互將重新實例化該bean,並且變量將會消失(好吧,變量仍然存在 - 其價值消失)。

您是否有使用@PostConstruct來初始化地址的令人信服的理由?這聽起來像你有一個主頁面,用戶開始與程序進行交互,從用戶輸入的主頁面(或程序以其他方式檢索)用戶的contactId。此contactId變量用於填充數據表,顯示與該用戶的contactId關聯的所有地址。這聽起來像錯誤是在你的bean邏輯中。

您需要先獲取contactId,然後使用它填充數據表。我不知道你的程序/用戶如何與bean交互來提供contactId。如果contactId是從用戶輸入的,則不要在@PostConstruct中初始化地址列表,因爲在輸入contactId之前,它始終會被初始化。如果程序從例如用戶類型的變量(它知道是因爲用戶已登錄並且程序創建/從數據庫中檢索到用戶的contactId)中自動獲取contactId,則應該能夠將該代碼包含在@PostConstruct - 在數據表初始化之前。

或者,而不是使用@PostConstruct,只需在你網頁的方法調用在一個點之前你的頁面(view)引用的任何變量。你可以把這個方法調用正確的網頁上:

#{} myBean.myMethod 這裏的其他代碼...

這個bean應該叫和建造你到前方法調用和用戶的contactId應該可用於bean的數據操作。 (因爲我們看不到你的bean邏輯,所以我對這個最後一點做出了假設。)

+0

「你可以直接在頁面上調用方法: #{myBean.myMethod}這裏有其他代碼。 ..「這是我沒想到的一個想法,但這對我不起作用。你對我的計劃如何運作的假設是正確的。我只需要一種方法來在視圖加載之前實例化bean,或者像你所建議的那樣在視圖的頂部。 – medium 2011-02-09 17:26:31