JSF/ValueChangeListener
Un article de JTips.
< JSF
Les value change listeners sont invoqués en fin de phase PROCESS VALIDATION, si la local value du composant à l'origine de l'évènement a été modifiée depuis la dernière requête HTTP. Ces listeners sont souvent difficiles à exploiter, car les champs d'instance des backing beans sont mis à jour plus tard, pendant la phase UPDATE MODEL VALUES (invocation des setters dans les backing beans) : si le but de notre value change listener était de mettre à jour un champ du backing bean, ce dernier est alors écrasé. L'astuce suivante permet de relancer l'évènement value change event après l'invocation des setters des backing beans :
public void myValueChangeListener(ValueChangeEvent event) {
PhaseId phaseId = event.getPhaseId();
if (phaseId.equals(PhaseId.ANY_PHASE)) {
event.setPhaseId(PhaseId.UPDATE_MODEL_VALUES);
event.queue();
} else if (phaseId.equals(PhaseId.UPDATE_MODEL_VALUES)) {
// le champ d'instance myValue est mis à jour par
// le listener et ne sera pas écrasé plus tard par
// invocation du setter
this.myValue = event.getNewValue();
}
}

