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

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

Атрибут PrimeFaces ajax помещает объект 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" или иметь собственной формы, но ala). Вы можете проверить, например. на FacesContext#isPostback() и FacesContext#isValidationFailed(), если выполняется успешная обратная передача:

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

См. также: