我在处理我的应用程序的范围时非常困难。从视图初始化托管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