EL expression à l'intérieur de p:commandButton onclick ne met pas à jour/re-rendu sur requête ajax?
La onclick
attribut de mon commandButton
a quelques EL dépendant de Javascript à l'intérieur. Pour être plus précis, voici le morceau de code:
<p:commandButton
onclick="javascript: if('#{userBean.user.friendList.size() gt 0}' == 'true') deleteFriendsConfirmDialog.show(); else friendsAlreadyDeletedErrorDialog.show();"
value="Delete all friends?" />
deleteFriendsConfirmDialog
efface la liste des amis et des mises à jour de la @form
. La liste d'amis, bouton de commande et les boîtes de dialogue sont tous sous cette forme.
Donc je clique sur le bouton, la boîte de dialogue de confirmation apparaît (en raison de la longueur de la liste d'amis est gt 0), je confirme, et la liste est vidée, la vue est mise à jour. Cependant, lorsque je clique sur le Delete all friends?
bouton une fois de plus, la boîte de dialogue de confirmation. Puisque la longueur de la liste est maintenant à 0, j'ai plutôt s'attendre à la boîte de dialogue d'erreur à afficher.
Qui, je pense, c'est parce que le Javascript écrit à l'intérieur de onclick
n'est pas mis à jour (bien que le bouton est dans la forme).
Edit: Changer #{userBean.user.friendList.size() gt 0}
à #{not empty userBean.user.friendList}
ne fonctionne pas non plus.
Comment venir? Quel est le problème ici?
Toute aide appréciée. 🙂
OriginalL'auteur Murat Derya Özen | 2012-01-11
Vous devez vous connecter pour publier un commentaire.
En effet. PrimeFaces (et la norme ACI) de ne pas re-évaluer la EL dans
on*
attributs sur une demande de base. Il ne se produit que sur une per-view. RichFaces, cependant, ne que, dans<a4j:xxx>
composants.Vous avez besoin pour résoudre le problème différemment. Je suggère l'utilisation de la
visible
attribut de la<p:dialog>
à la place.Une alternative est d'utiliser PrimeFaces'
RequestContext
dans la fève de la méthode d'action qui permet d'exécuter du code JavaScript par programmation dans l'haricot méthode d'action (bien que ce serré au couple le contrôleur un peu trop avec la vue, de l'OMI).avec
Sans rapport avec au problème concret, l'original de votre
onclick
, alors qu'il ne fonctionne pas dans votre cas particulier, montre certaines mauvaises pratiques. Lejavascript:
pseudoprotocol est superflu. C'est la valeur par défaut déjà. Le supprimer. Aussi le test contre== 'true'
est superflu. Le supprimer. Il suffit de laisser le EL impressiontrue
oufalse
directement. Ce qui suit est la syntaxe correcte (encore une fois, cela ne résout pas votre problème, juste pour votre information)Il aurait travaillé si vous étiez à l'aide de RichFaces'
<a4j:commandButton>
.visibility
attribut pour les boîtes de dialogue comme vous l'avez mentionné. Mais que dire de laonclick
attribut du bouton maintenant? Comment sait-il quelle boîte de dialogue de montrer? Parce qu'au chargement de la page, la liste peut-être déjà vide, ou pas.En outre, la
javascript:
et== true
n'étaient pas là au départ. Je viens d'essayer toutes les combinaisons possibles pour le faire fonctionner 🙂 Mais merci beaucoup pour l'astuce.Il suffit de retirer le
onclick
. Leupdate
du bouton de commande de mise à jour de la boîte de dialogue et ils seront ensuite affichés ou masqués en fonction du résultat de lavisible
attribut. Sitrue
, puis il affichera immédiatement, sinon sifalse
, alors il sera toujours caché. Le#{facesContext.postback}
sera de retourfalse
si c'est au chargement de la page (au moins, si vous adhérez à la pratique normale de naviguer entre les pages à l'OBTENIR).Je viens de comprendre pourquoi ça ne marchait pas pour moi. Le bouton n'a pas appeler quoi que ce soit. Ainsi, le
facesContext.postback
est d'abord faux. Par conséquent, en cliquant sur le bouton ne fait rien, même si il ya des amis dans la liste. En outre, si je supprime tous les amis un par un (en utilisant le bouton supprimer, j'ai placé sur chaque ligne), puis lorsque le dernier ami est supprimé,friendsAlreadyDeletedErrorDialog
montrera de nulle part. Aucune idée de quoi faire, d'autres que de prendre la deuxième approche?Comme pour le bouton en n'appelant pas quelque chose, essayez de
action="#{null}"
. Comme pour le bouton qui supprime amis célibataires, il doit effectuer une requête ajax et pas mise à jour de la "supprimer tous les amis" des boîtes de dialogue.OriginalL'auteur BalusC