我在處理我的應用程序的範圍時非常困難。從視圖初始化託管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上的按鈕不再處於活動狀態或活動狀態,因此在第一次用戶插入記錄後對話框不會打開。
這似乎是這應該是一件容易的事情,但我的應用程序有很多嵌套的意見是導致問題。任何關於如何處理這種事情的見解都會幫助你。
「你可以直接在頁面上調用方法: #{myBean.myMethod}這裏有其他代碼。 ..「這是我沒想到的一個想法,但這對我不起作用。你對我的計劃如何運作的假設是正確的。我只需要一種方法來在視圖加載之前實例化bean,或者像你所建議的那樣在視圖的頂部。 – medium 2011-02-09 17:26:31