次のような状況です。
ボタンをクリックした後、いくつかのビジネスロジックが実行され、実行後、レポートを含む新しいタブが表示されます。
<p:commandButton value="this button" update="growlMain"
actionListener="#{myBean.businesslogic}"
onstart="ajaxDialog.show();"
oncomplete="ajaxDialog.hide();"
onsuccess="window.open('./report.jsp', '_newtab');" />
これは動作しません :(
ビジネスロジックが数ミリ秒しか続かない場合、次のように機能します。
<p:commandButton value="this button" update="growlMain"
actionListener="#{myBean.fastbusinesslogic}"
onclick="window.open('./report.jsp', '_newtab');" />
onclickは新しいタブを開きます。onstartのようなものもありますが、onsuccessまたはoncompleteでは機能しません。どうして?また、数秒続くビジネスロジックのソリューションはありますか?
PrimeFacesコマンドボタンのonsuccessが機能しないことに気づきました。ただし、oncompleteは機能し、エラーが発生した場合でも必要な処理を実行します。たとえば、私の場合は、ビジネスロジックにエラーが発生した場合でも成功ダイアログが表示されます。 onsuccessを使用しようとしましたが、機能しません。あなたは以下のようにoncompleteを試すことができます:
<p:commandButton value="this button" update="growlMain"
actionListener="#{myBean.businesslogic}"
onstart="ajaxDialog.show();"
oncomplete="ajaxDialog.hide(); window.open('./report.jsp', '_newtab');"/>
onclickはajaxリクエストが作成される前に(純粋なクライアント側で)呼び出されますが、oncompleteとonsuccessはサーバーがajaxリクエストに応答した後に実行されます。したがって、たとえば、ダイアログを表示する前にビジネスロジックを実行する必要がある場合は、oncompleteを使用します。それは私がいつも使っているものです。
検証エラーがない場合にのみ実行するように、JavaScriptをoncomplete内で調整することもできます。直感的には、成功はそのように動作し、検証エラーがない場合にのみ実行されると思いますが、それはそうではありません。両者の違いはよくわかりません。バッキングBeanでsuccess = falseにフラグを立てる方法はあると思いますが、ドキュメントでは実際には見つかりませんでした。
Oncomplete属性の検証を確認する場合は、次のようにします。
oncomplete="if (!args.validationFailed){someDialog.hide()}"
この場合、フィールドが適切に検証されている場合にのみダイアログを閉じます。実際にバッキングBeanからパラメーターを注入し、リクエストが処理された後にそれらをJavaScriptで使用できます。バッキングBeanでは、次のようなことができます。
RequestContext.getCurrentInstance().addCallbackParam("showDialog", false);
そして、不完全な属性で次のようなパラメーターにアクセスできます。
oncomplete="if (args && args.showDialog){someDialog.show()}else{ alert('the bean didnt let me open the dialog')}"
とにかく、それが役に立てば幸いです。