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()" />

通常のバリデータではなくアクション メソッドでバリデーションを実行していて、それをやり直すことができない場合は、手動で を呼び出す必要があります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 に答える