【问题标题】:View scoped managed bean's @PostConstruct reinvoked after closing p:dialog查看关闭 p:dialog 后重新调用的作用域托管 bean 的 @PostConstruct
【发布时间】: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


【解决方案1】:

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

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

在上面的代码中只要点击提交按钮:
1.你的action会被触发调用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();" />

所以在上述情况下p:dialog 将在action 完成后关闭。

【讨论】:

    猜你喜欢
    • 2011-10-07
    • 2011-12-23
    • 2013-10-09
    • 1970-01-01
    • 2016-04-23
    • 1970-01-01
    • 2013-09-14
    • 1970-01-01
    • 2012-05-26
    相关资源
    最近更新 更多