L'ordre d'exécution des événements lorsque vous appuyez sur PrimeFaces p:commandButton
Je suis en train d'exécuter une JSF2 méthode d'haricot et afficher une boîte de dialogue après l'achèvement de la méthode sur cliquez de PrimeFaces <p:commandButton>
.
<p:commandButton id="viewButton" value="View"
actionlistener="#{userBean.setResultsForSelectedRow}" ajax="false"
update=":selectedRowValues"
oncomplete="PF('selectedRowValuesDlg').show()">
</p:commandButton>
<p:dialog id="selectedRowValues" widgetVar="selectedRowValuesDlg" dynamic="true">
<h:outputText value="#{userBean.selectedGroupName}" />
</p:dialog>
Quand je clique sur le bouton de commande, le haricot d'action de la méthode écouteur setResultsForSelectedRow
s'exécute correctement, mais il n'affiche pas la boîte lorsque la méthode est terminée. Si je supprime actionlistener
, il montre la boîte de dialogue. Je ne sais pas ce qui ne va pas.
Qu'est-ce que l'ordre d'exécution des événements? Est-il possible d'exécuter actionlistener
et oncomplete
simultanément?
- Vous êtes explicitily réglage
ajax=false
sur le bouton de commande et d'essayerajax update
. Il ne fonctionne pas de cette façon. Essayez de supprimerajax=false
et ajouterprocess=@this
sur<p:commandButton/>
et non vous ne pouvez pas exécuteractionListener
etoncomplete
en même temps. - Merci Chris pour la réponse rapide..j'ai essayé de processus=@, mais il ne fonctionne pas..aussi je ne peux pas exécuter actionListener et oncomplete dans le même temps,alors, il est une autre approche que je peux utiliser?
Vous devez vous connecter pour publier un commentaire.
Il a échoué parce que vous avez utilisé
ajax="false"
. Il déclenche un full synchrone demande qui, à son tour, provoque un rechargement complet de la page, causant laoncomplete
à ne jamais être tiré (notez que toutes les autres ajax attributs commeprocess
,onstart
,onsuccess
,onerror
etupdate
sont jamais tiré).Qu'il a travaillé quand vous avez supprimé
actionListener
est également impossible. Il n'a pas la même façon. Peut-être que vous avez aussi suppriméajax="false"
le long de lui, sans réellement comprendre ce que vous faisiez. Retraitajax="false"
devrait en effet atteindre l'exigence.Pas. Le script ne peut être tiré avant ou après l'action de l'auditeur. Vous pouvez utiliser
onclick
à feu le script au moment du clic. Vous pouvez utiliseronstart
à feu le script au moment de la requête ajax est sur le point d'être envoyé. Mais ils ne seront jamais exactement simultanément être tiré. La séquence est la suivante:onclick
Code JavaScript est exécutéprocess
et HTML en cours arborescence DOMonstart
Code JavaScript est exécutéprocess
actionListener
JSF backing bean méthode est exécutéeaction
JSF backing bean méthode est exécutéeupdate
et actuel JSF composant arbreonsuccess
code JavaScript est exécutéonerror
code JavaScript est exécutéupdate
basée sur la réponse ajax et HTML en cours arborescence DOMoncomplete
Code JavaScript est exécutéNoter que le
update
est effectuée aprèsactionListener
, donc si vous utilisezonclick
ouonstart
pour afficher la boîte de dialogue, puis il peut encore montrer de l'ancien contenu au lieu de la mise à jour de contenu, ce qui est mauvais pour l'expérience utilisateur. Vous feriez mieux d'utiliseroncomplete
au lieu d'afficher la boîte de dialogue. Notez également que vous feriez mieux d'utiliseraction
au lieu deactionListener
lorsque vous avez l'intention d'exécuter une action commerciale.Voir aussi:
oncomplete="PF('dg').show()"
, mais avant d'ouvrir cette boîte de dialogue, je voudrais faire un chèque, et si elle échoue, je ne veux pas ouvrir cette boîte de dialogue (ne pas appeler oncomplete).RequestContext
. Je me demandais si il y avait une autre façon de le faire. Merci @BalusC 😉J'adore tout simplement obtenir de l'information comme BalusC donne ici - et il est assez gentil pour aider beaucoup de gens avec de telles informations que je considère ses paroles d'évangile, mais je n'étais pas en mesure d'utiliser que l'ordre des événements pour résoudre ce même genre de problème de synchronisation dans mon projet. Depuis BalusC mettre un grand général de référence d'ici que je même de marquer, j'ai pensé que je donnerais ma solution pour des problèmes de synchronisation de la même place, puisqu'il ne résoudre l'affiche originale du calendrier des problèmes. J'espère que ce code permet à quelqu'un:
La boîte de dialogue est à la tête de l'XHTML en dehors de cette forme, et il a une forme de sa propre intégré dans la boîte de dialogue avec un datatable qui tient les commandes pour le streaming de médias que tout le nécessaire pour être apprêté et prêt à aller quand le dialogue est présenté. Vous pouvez utiliser cette même technique pour faire des choses comme télécharger des documents personnalisés qui doivent être préparés avant qu'ils soient transmis à l'ordinateur de l'utilisateur via fileDownload boutons dans la boîte de dialogue.
Comme je l'ai dit, c'est un exemple plus compliqué, mais il touche tous les points forts de votre problème et le mien. Lorsque le bouton de commande est cliqué, le résultat est tout d'abord d'assurer la sauvegarde de haricot est mis à jour avec les résultats de la liste de choix, puis de dire la sauvegarde de la fève à préparer les flux pour l'utilisateur en fonction de leurs choix dans la liste de sélection, puis de mettre à jour les contrôles dans le dialogue dynamique avec une mise à jour, puis cliquez sur afficher la boîte de dialogue prêt pour l'utilisateur pour démarrer la diffusion de leur contenu.
L'astuce c'est d'utiliser BalusC de l'ordre des événements pour le principal bouton de commande, puis ajouter le
<p:ajax process="formPickList" />
peu pour s'assurer qu'il a été exécuté d'abord - parce que rien ne se passe correctement, à moins que la liste de choix mis à jour le backing bean première (chose qui n'était pas passé pour moi avant que je l'ai ajouté). Donc, oui, ce bouton de commande roches parce que vous pouvez affecter précédente, l'attente et les composants actuels ainsi que la sauvegarde des haricots, mais le moment d'être en interrelation tous d'entre eux n'est pas facile d'obtenir une poignée sur parfois.Bon codage!