2011-02-09 98 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