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).