web-dev-qa-db-fra.com

Primefaces onclick et onsuccess différences

J'ai la situation suivante:

après avoir cliqué sur un bouton, la logique métier est terminée et ensuite, un nouvel onglet avec un rapport doit être visible.

<p:commandButton value="this button" update="growlMain"
                 actionListener="#{myBean.businesslogic}" 
                 onstart="ajaxDialog.show();"
                 oncomplete="ajaxDialog.hide();"
                 onsuccess="window.open('./report.jsp', '_newtab');" />

Cela ne fonctionne pas :(

Si la logique métier ne dure que quelques millisecondes, les opérations suivantes fonctionnent:

<p:commandButton value="this button" update="growlMain"
                 actionListener="#{myBean.fastbusinesslogic}" 
                 onclick="window.open('./report.jsp', '_newtab');" />

onclick ouvre un nouvel onglet, ainsi que des choses comme onstart mais cela ne fonctionne pas avec onsuccess ou oncomplete Pourquoi? Et existe-t-il une solution pour la logique métier qui dure quelques secondes?

16
Ziagl

J'ai remarqué que le bouton de commande onsuccess for PrimeFaces ne fonctionnait pas. Oncomplete cependant fonctionne et fait le nécessaire même s'il y a une erreur, comme dans mon cas, montre un dialogue de succès même s'il y a une erreur dans ma logique métier. Essayé d'utiliser onsuccess mais ne fonctionne pas . Vous pouvez essayer oncomplete comme ci-dessous:

<p:commandButton value="this button" update="growlMain"
                 actionListener="#{myBean.businesslogic}" 
                 onstart="ajaxDialog.show();"
                 oncomplete="ajaxDialog.hide(); window.open('./report.jsp', '_newtab');"/>
7
Gunjan Kalra

onclick est appelé avant même que la demande ajax soit créée (côté client pur) alors que oncomplete et onsuccess sont exécutés après que le serveur a répondu à la demande ajax. Ainsi, si vous devez exécuter une logique métier avant d'afficher une boîte de dialogue, par exemple, vous souhaitez utiliser oncomplete. C'est ce que j'utilise toujours.

Vous pouvez également conditionner votre code javascript dans oncomplete pour qu'il s'exécute uniquement en l'absence d'erreur de validation. Intuitivement, je pense que onsuccess se comporterait de la sorte et ne s'exécuterait que s'il n'y avait pas d'erreur de validation, mais ce n'est pas comme ça que ça se passe. Je ne sais pas vraiment la différence entre eux. Je suppose qu'il existe un moyen de signaler success = false dans les haricots de support, mais je ne pouvais pas vraiment le trouver dans la documentation.

Si vous souhaitez vérifier la validation dans votre attribut oncomplete, procédez comme suit:

oncomplete="if (!args.validationFailed){someDialog.hide()}"

Dans ce cas, vous ne fermeriez la boîte de dialogue que si les champs sont correctement validés. Vous pouvez réellement injecter des paramètres à partir du bean support et les utiliser dans le javascript après que la demande a été servie. Dans votre haricot de sauvegarde, vous pouvez faire quelque chose comme ceci:

RequestContext.getCurrentInstance().addCallbackParam("showDialog", false);

Et vous pouvez accéder au paramètre comme celui-ci dans votre attribut incomplet:

oncomplete="if (args &amp;&amp; args.showDialog){someDialog.show()}else{ alert('the bean didnt let me open the dialog')}"

Quoi qu'il en soit, j'espère que cela aide.

33
Andre

Vous pouvez voir la différence ici:

Evénement Primefaces et ajax onsuccess

ou avec succès, vous pouvez faire quelque chose avant le chargement complet de DOM

1
makkasi