83 votes

Quand utiliser valueChangeListener ou f:ajax auditeur?

Quelle est la différence entre les deux morceaux de code - en ce qui concerne listener placement?

<h:selectOneMenu ...>
    <f:selectItems ... />
    <f:ajax listener="#{bean.listener}" />
</h:selectOneMenu>

et

<h:selectOneMenu ... valueChangeListener="#{bean.listener}">
    <f:selectItems ... />
</h:selectOneMenu>

178voto

BalusC Points 498232

L' valueChangeListener uniquement être invoquée lorsque le formulaire est soumis et les soumises valeur est différente de la valeur initiale. Si vous souhaitez soumettre le formulaire lors de la DOM HTML change événement, vous devez ajouter un autre <f:ajax/> sans un "listener" (!) pour le composant d'entrée.

L' <f:ajax listener> est dans cette construction par défaut exécuté pendant le DOM HTML change événement déjà (à l'intérieur d' UICommand des composants d'entrée et de composants représentant une case à cocher ou un bouton radio, il serait par défaut exécuté pendant le DOM HTML click cas seulement).

Une autre différence majeure est que l' valueChangeListener méthode est invoquée au cours de la fin de la PROCESS_VALIDATIONS phase. À ce moment, la valeur soumise n'est pas été mis à jour dans le modèle encore. Si vous ne pouvez pas l'obtenir par le simple accès à la fève de la propriété qui est lié à l'entrée du composant, value. Vous avez besoin de l'obtenir en ValueChangeEvent#getNewValue(). L'ancienne valeur est également disponible en ValueChangeEvent#getOldValue().

L' <f:ajax listener> méthode est appelée lors de INVOKE_ACTION phase. À ce moment, la valeur soumise est déjà été mis à jour dans le modèle. Vous pouvez juste obtenir en accédant directement à la fève de la propriété, qui est lié à l'entrée du composant, value.

Aussi, si vous avez besoin de mettre à jour une autre propriété en fonction de la valeur soumise, alors il ne pourrait pas lorsque vous utilisez valueChangeListener que la mise à jour de la propriété peut être remplacée par la valeur soumise au cours de la UPDATE_MODEL_VALUES phase. C'est exactement pourquoi vous voyez dans le vieux-JSF 1.les applications x/tutoriels/ressources qu' valueChangeListener est dans construire été utilisé en combinaison avec d' immediate="true" et FacesContext#renderResponse() pour le prévenir. Après tout, à l'aide de l' valueChangeListener d'exécuter les actions commerciales a en fait toujours été un hack/solution de contournement.

Résumé: l'Utilisation de l' valueChangeListener seulement si vous avez besoin d'intercepter sur la valeur réelle de changement lui-même. I. e. vous êtes réellement intéressés à la fois l'ancienne et la nouvelle valeur (par exemple, pour la session). Utiliser l' <f:ajax listener> seulement si vous avez besoin d'exécuter une action commerciale sur la nouvelle valeur. I. e. vous vous intéressez vraiment seulement la nouvelle valeur (par exemple, pour remplir une deuxième liste déroulante).

9voto

a.u.r Points 417

pour le premier fragment (ajax auditeur attribut):

Le "listener" attribut d'un ajax tag est une méthode qui est appelée sur le côté serveur à chaque fois que la fonction ajax qui se passe sur le côté client. Par exemple, vous pouvez utiliser cet attribut pour spécifier un serveur de côté la fonction à appeler à chaque fois que l'utilisateur appuie sur une touche

mais le deuxième fragment (valueChangeListener) :

Le ValueChangeListener ne sera appelée lorsque le formulaire est soumis, et non pas lorsque la valeur de l'entrée est changé

*vous aimeriez voir cette pratique répondre

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X