我在我的XHTML
中定义了一个弹出窗口,它会根据用户在默认情况下呈现的主屏幕中所做的选择而有条件地显示:
<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
方法。支持bean是@ViewScoped
。我真的不希望它这样做,相反,我希望它将对话框/弹出窗口视为页面中的div,其闭包不会影响视图状态。
第一次启动对话框时,不会调用@PostConstruct,因为渲染页面的初始视图(称为@PostConstruct)仍处于活动状态。然而,在第二次出现时,它被重新调用,这使我相信它是因为它在第一次关闭后,框架的容器或两者都错误地需要重新加载bean。
关闭此对话框后,我该怎么做才能阻止支持bean进入@PostConstruct?
答案 0 :(得分: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
将被触发以调用ManagedBean方法managedBean.proceed
2.由于你绑定了onclick
JS事件,你的对话框将被关闭。
在您action="#{managedBean.proceed}
返回后,由于您使用了commentSubmit
,因此必须更新ID为render="commentSubmit"
的按钮。
但是当您的action="#{managedBean.proceed}
返回render="commentSubmit"
时,关闭了按钮commentSubmit
的异议。所以这可能是重新初始化ManagedBean的原因。
为了避免这种情况,你可以使用具有p:commandButton
属性的Primefaces oncomplete
,这在这种情况下是有用的。
<p:commandButton id="commentSubmit" value="Submit" action="#{managedBean.proceed}" update="commentSubmit" oncomplete="PF('commentDialog').hide();" />
因此,在上述情况下,p:dialog
将在action
完成后关闭。