【发布时间】:2015-07-21 20:29:22
【问题描述】:
我在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?
【问题讨论】:
-
我不知道它是否能解决问题,但您应该在 PrimeFaces 组件中使用
p:ajax而不是f:ajax,就像在您的p:inputTextarea中一样... -
有趣,这确实解决了问题!
-
请用新代码和一些关于更改内容的文本创建一个答案
标签: jsf primefaces managed-bean