Как отображать диалог только после завершения успешной отправки формы

У меня есть форма с 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>  

Я хотел бы показать диалоговое окно только после того, как проверка пройдена и метод действия выполнен. Однако, когда необходимые поля ввода пусты и, таким образом, метод действия не выполняется, диалоговое окно все еще отображается.

Как отобразить диалоговое окно только после успешного завершения отправки формы?

1 ответ

Решение

Ответ ajax PrimeFaces ставит args объект в области JS, который имеет validationFailed имущество. Вы можете просто проверить это в oncomplete,

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

Если вы выполняете валидацию в методе действия вместо обычного валидатора, и вы не можете это переделать, вам нужно вручную вызвать 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}">

Смотрите также:

Другие вопросы по тегам