【发布时间】:2011-02-09 16:39:49
【问题描述】:
我在处理我应该在我的应用程序上使用什么 Scope 时遇到了很大的困难。
我正在使用 Primefaces,并使用 a 作为我的初始视图布局。在布局之外,我有许多不同的托管 bean 使用的对话框。
在我的布局中,我有一个页眉、页脚和左侧的导航,然后是中心的当前视图。所以我的看法如下:
<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.数据表上的按钮不再活动或活动,因此在用户第一次插入记录后对话框不会打开。
这似乎应该是一件容易的事,但我的应用程序有许多嵌套视图,这导致了问题。任何有关如何处理此类事情的见解都会有所帮助。
【问题讨论】:
标签: jsf-2 primefaces