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>  

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

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

4

1 回答 1

23

PrimeFaces ajax 响应将一个args对象放入具有属性的 JS 范围内validationFailed。你可以在oncomplete.

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

如果您在 action 方法中而不是在普通的验证器中执行验证,并且您无法对其进行返工,那么您需要手动调用FacesContext#validationFailed().

也可以看看:


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

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

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

也可以看看:


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

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

也可以看看:

于 2013-05-28T15:36:29.337 回答