在关闭p:对话框后重新调用作用域的托管bean的@PostConstruct

时间:2015-07-21 20:29:23

标签: jsf primefaces managed-bean

我在我的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?

1 个答案:

答案 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完成后关闭。