我有一个包含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方法时才显示对话框。但是,当所需的输入字段为空并且因此未执行操作方法时,仍会显示该对话框。
如何在完成成功的表单提交后才显示对话框?
答案 0 :(得分:23)
PrimeFaces ajax响应在JS作用域中放置一个args
对象,该对象具有validationFailed
属性。你可以在oncomplete
。
<p:commandButton ... oncomplete="if (args && !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"