如何仅在完成成功的表单提交时显示对话框

时间:2013-05-28 15:00:07

标签: validation jsf primefaces dialog

我有一个包含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>  

我想仅在验证通过并执行action方法时才显示对话框。但是,当所需的输入字段为空并且因此未执行操作方法时,仍会显示该对话框。

如何在完成成功的表单提交后才显示对话框?

1 个答案:

答案 0 :(得分:23)

PrimeFaces ajax响应在JS作用域中放置一个args对象,该对象具有validationFailed属性。你可以在oncomplete

中检查一下
<p:commandButton ... oncomplete="if (args &amp;&amp; !args.validationFailed) dialogaboutDEQ.show()" />

如果您正在执行validation in action method instead of in a normal validator,并且无法重做,则需要手动拨打FacesContext#validationFailed()

另见:


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

RequestContext.getCurrentInstance().execute("dialogaboutDEQ.show()");

如果验证失败,则不会调用action方法,然后也不会执行此操作。

另见:


另一种不同的选择是使用对话框的visible属性。你的命令按钮显然正在更新整个表单,包括对话框(即使对话框是appendToBody="true"严重声明的,这会导致它不再在父表单中;即它必须有{{1}或者有自己的形式,但是ala)。你可以检查,例如如果成功回发,请FacesContext#isPostback()FacesContext#isValidationFailed()

appendToBody="false"

另见: