2015-07-21 18 views
0

我有一个弹出我的XHTML它获得展示有条件地取决于用户在默认情况下呈现在主屏幕何种选择中定义:查看范围内管理收盘P上之后bean的@PostConstruct重新调用:对话框

<p:dialog id="commentDialogID" header="Enter comment" widgetVar="commentDialog" modal="true" resizable="true" height="auto"> 
    <h:form id="commentForm"> 

     <h:outputLabel for="comment" value="Comment:"/> 

     <p:inputTextarea id="comment" title="Comment" 
       rows="6" cols="33" 
       value="#{managedBean.activeItem.comment}" 
       required="true"> 
      <f:ajax render="comment"/> 
     </p:inputTextarea> 

     <h:commandButton id="commentSubmit" value="Submit" action="#{managedBean.proceed}" onclick="PF('commentDialog').hide();"> 
      <f:ajax render="commentSubmit"/> 
     </h:commandButton> 

    </h:form> 
</p:dialog> 

的问题在于,一旦关闭了对话框/弹出窗口,容器(JBoss)或框架(JSF/Primefaces),不知道哪个,认为整个视图已关闭,因此在触发此弹出窗口的下一个请求时,它重新调用支持bean的方法@PostConstruct。支持豆是@ViewScoped。我真的不希望它做到这一点,相反,我希望它把对话框/弹出窗口当作div的关闭不影响视图状态的页面。

第一次调出对话框时,@PostConstruct不会作为初始视图调用,因为呈现页面的初始视图(称为@PostConstruct)仍处于活动状态。然而,第二次出现时,它被重新调用了,这让我相信这是因为它在第一次之后被关闭了,无论是框架的容器还是错误都需要重新加载bean。

在关闭此对话框后,我可以做些什么来阻止backing bean进入@PostConstruct?

+1

我不知道它是否会解决问题,但是您应该在PrimeFaces组件中使用'p:ajax'而不是'f:ajax',就像在您的'p:inputTextarea'中一样...... –

+0

有趣,解决这个问题 !! – amphibient

+0

请使用新代码和一些关于更改内容的文本创建答案 – Kukeltje

回答

1

我知道问题所在。
您正在使用h:commandButton来提交表单并关闭对话框。
让我们看看你的代码:

<h:commandButton id="commentSubmit" value="Submit" action="#{managedBean.proceed}" onclick="PF('commentDialog').hide();"> 
    <f:ajax render="commentSubmit"/> 
</h:commandButton> 

在上面的代码只要你clikc提交按钮:
1.您action将得到triggred调用ManagedBean方法managedBean.proceed
2.由于您绑定了onclick JS事件,您的对话框会关闭。

当您的action="#{managedBean.proceed}回来后,必须更新id为commentSubmit的按钮,因为您已使用render="commentSubmit"
但是,当您的action="#{managedBean.proceed}回到render="commentSubmit"您的按钮commentSubmit被放置在disloag关闭。所以这可能是重新初始化ManagedBean的原因。

要避免这种情况,您可以使用Primefaces p:commandButton,该属性在此方案中具有oncomplete属性,这是非常有用的。

<p:commandButton id="commentSubmit" value="Submit" action="#{managedBean.proceed}" update="commentSubmit" oncomplete="PF('commentDialog').hide();" /> 

因此,在上述情况下,action完成后p:dialog将关闭。