Primefaces对话框中的commandButton仅在后续单击时触发操作

Primefaces对话框中的commandButton仅在后续单击时触发操作,primefaces,modal-dialog,commandbutton,Primefaces,Modal Dialog,Commandbutton,我的commandButton上的Primefaces对话框和actionListener有点问题 提供一点背景: 我维护的应用程序当前使用的是旧版本的ICEfaces。我的任务是找出用当前版本的Primefaces(我目前使用的是5.2.6)替换它是否会带来速度/反应时间方面的好处,以及我们需要做什么来替换框架。我们必须以最少的工作量完成这项工作,因此重建所有弹出窗口是不可能的 现在,我们来谈谈眼前的问题: 我正在尝试用p:dialog替换旧的ace:dialog,到目前为止,这就像切换标签一

我的
commandButton
上的Primefaces
对话框和
actionListener
有点问题

提供一点背景:
我维护的应用程序当前使用的是旧版本的ICEfaces。我的任务是找出用当前版本的Primefaces(我目前使用的是5.2.6)替换它是否会带来速度/反应时间方面的好处,以及我们需要做什么来替换框架。我们必须以最少的工作量完成这项工作,因此重建所有弹出窗口是不可能的

现在,我们来谈谈眼前的问题:
我正在尝试用
p:dialog
替换旧的
ace:dialog
,到目前为止,这就像切换标签一样简单。对话框的工作原理与以前几乎相同,但我对
h:commandButton
有一个奇怪的问题
我挑选了一个弹出窗口,用于显示错误消息,用于进行概念验证。我知道其他弹出窗口也有同样的问题。下面是这个弹出窗口的代码,我把它简化为基本的必需品

<ui:composition xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:h="http://java.sun.com/jsf/html" xmlns:p="http://primefaces.org/ui">
<p:dialog id="ErrorPopupID" widgetVar="panelPopupErrorWidget" 
    position="center" modal="true" resizable="false" draggable="false" 
    closeOnEscape="false" header="Errors"
    visible="#{errorPopupBean.renderErrorPopup}">
        <h:panelGroup style="width:320px;">
            <div style="height:218px;padding:5px;">
                <h:outputText escape="false" value="Error text"/>
            </div>
                <h:form>
                <div style="padding-left:5px;">
                    <h:commandButton id="errorPopupCloseButton"
                     value="Close"
                     actionListener="#{errorPopupBean.closeErrorPopup}"/>
                </div>
            </h:form>
        </h:panelGroup>
</p:dialog>

如您所见,弹出窗口包含一个按钮,基本上只是关闭弹出窗口,并清除消息列表。由于某种原因,我无法理解,只有在我第二次单击按钮时才会触发该操作。当我第一次点击它时,从用户的角度来看,似乎什么都没有发生。
然而,我碰巧有一个
PhaseListener
,因此我知道,在第一次单击时,会向服务器发送请求,但只执行生命周期的第1和第6阶段。只有在第二次单击时,整个生命周期(包括
INVOKE\u应用程序
)才会被处理并触发操作。但我不明白为什么

以下是我尝试过但没有成功的方法:

  • h:commandButton
    替换为
    p:commandButton
  • 尝试了
    h:form
    的不同嵌套(最初在
    p:dialog
    之外)
  • 移动了
    ui:include
    ,用于直接在
  • 尝试了
    primefaces的
    FULL
    PARTIAL
    。提交
  • 上述各项的各种变化
  • 编辑:除了我实际使用的5.2.6版本外,我还尝试了Primefaces的三个不同版本,4.0.10和5.0.10,只是想看看这是不是PF的一个小故障
我在这里不知所措,不知道还能做什么。它适用于ICEfaces,因此我认为它也适用于Primefaces。

我在这里也检查了其他问题,但它们要么处理不同的场景,要么根本不起作用。我的命令行得通,但并不完全正确。

你能试试p:带有属性的commandButtonajax=“false”对话框是如何关闭的?在支持bean中使用javascript?尝试
oncomplete=“PF('panelPopupErrorWidget').hide()”>
@opfau对话框的可见性属性值由bean决定。这意味着操作方法只是清除一个列表,然后
errorpopubean.renderErrorPopup
返回false。这是可行的,但不是问题所在。弹出窗口按预期关闭。问题在于,操作事件仅在第二次单击按钮时触发,而不是第一次。我可以在调试器和
PhaseListener
输出中清楚地看到这一点。将其更改为
,但没有任何更改。行为还是一样的。