成功提交表单后如何仅显示对话框

13

我有一个表单,其中包含2个必填字段和一个显示对话框的命令按钮:

<p:commandButton id="showDialogButton" value="Enregistrer" 
    action="#{DEQbean.Ajouter()}" update="@form"
    oncomplete="dialogaboutDEQ.show()" />

<p:dialog id="reamrquesDEQ" widgetVar="dialogaboutDEQ" header="Informations"
    width="400" closable="false" resizable="false" showEffect="clip"
    hideEffect="clip" modal="true" appendToBody="true">

    <p:messages id="messages" showDetail="true" autoUpdate="true"/>
    <p:commandButton value="OK" action="DEQlist" />    
</p:dialog>  

我希望在验证通过并执行操作方法时才显示对话框。然而,当必填输入字段为空且因此未执行操作方法时,仍会显示对话框。

我该如何仅在成功提交表单后显示对话框?


首先:重新构思你的问题。很难理解你在问什么。如果你把格式排版好并尽可能清晰明了,你肯定会得到更多的关注。 然而,如果我正确地解释了你的问题,那么这个问题的答案可能会有所帮助。 - Jens
@Jens:在你发表评论之前,问题已经被编辑了10分钟。 - BalusC
抱歉,我没有注意到。当我意识到这不仅是一些英语上的缺陷时,我开始自己编辑问题,但最终放弃了。然后我写了我的评论。你如何决定自己编辑问题以及何时要求OP这样做?我相信Adriano本可以做得更好。而且看着你的编辑,这不仅仅是一些“清理”糟糕的英语。Adriano在哪里有动力努力在下一个问题上做得更好呢? - Jens
1个回答

25
PrimeFaces的ajax响应将一个args对象放置在JS范围内,该对象具有一个validationFailed属性。您可以在oncomplete中检查它。
<p:commandButton ... oncomplete="if (args &amp;&amp; !args.validationFailed) dialogaboutDEQ.show()" />

如果您正在操作方法中执行验证而不是在普通验证器中执行validation, 并且您无法重新设计它,则需要手动调用FacesContext#validationFailed()

另请参阅:


另一种选择是在操作方法中使用RequestContext#execute(),以编程方式指示PrimeFaces执行给定的JS代码。因此,您可以在操作方法中执行此操作,而不是使用oncomplete
RequestContext.getCurrentInstance().execute("dialogaboutDEQ.show()");

如果验证失败,那么操作方法不会被调用,因此这也不会被执行。

参见:


另一种选择是使用对话框的visible属性。您的命令按钮显然正在更新整个表单,包括对话框(即使对话框已经使用appendToBody="true"进行了错误声明,这将导致它不再位于父表单内; 即必须具有appendToBody="false"或拥有自己的表单,但是)。您可以检查例如FacesContext#isPostback()FacesContext#isValidationFailed()是否执行了成功的回发:

<p:dialog ... visible="#{facesContext.postback and not facesContext.validationFailed}">

参见:


@BalusC先生,您真的是我的英雄,您救了我的命。非常感谢您。 - Adriano_jvma

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接