juillet
2009
Salut
Je me suis un peu lutté ce matin sur ce sujet, alors voici un rapide post : imaginez que vous avez une liste déroulante ou un radio group et que vous voulez mettre à jour quelque chose en fonction de la sélection. Évidemment, vous voulez une mise à jour via Ajax, nous sommes d’accord
Comment procéder ?
En Wicket, traditionnellement, on attache alors un « new AjaxEventBehavior(« onchange ») » et on fait notre tambouille dans le « onEvent() » qui va bien :
@Override
protected void onEvent(AjaxRequestTarget target) {
// je demande la mise à jour anticipée de mon modèle :
process();
// puis je réaffiche ce dont j'ai besoin :
target.add(MonFormulaire.this);
}
});
En effet, le AjaxEventBehavior permet de capturer des actions utilisateurs à la volée via Ajax. Donc on s’attend bien à intercepter la mise à jour et à aisément mettre notre modèle à jour.
Or, que se passe t il dans notre cas ? Notre onEvent est bien activé mais le process() ne met pas à jour notre modèle… Surprenant !
Oh, mais maintenant qu’j’y pense, un radio group ou une liste déroulante est un poil plus compliqué d’un simple élément html avec un « onchange »…
En effet, notre liste regroupe des options, notre radio groupe regroupe des radios et ainsi de suite. Cette complexité supplémentaire n’est pas gérée par l’AjaxEventBehavior, qui est unitaire, relié uniquement à un élément html. Du coup ça ne marche pas…
Aussi, quelle est la solution ?
Hé bé, tout simplement AjaxFormChoiceComponentUpdatingBehavior :
@Override
protected void onUpdate(AjaxRequestTarget target) {
// je demande la mise à jour anticipée de mon modèle :
process();
// puis je réaffiche ce dont j'ai besoin :
target.add(MonFormulaire.this);
}
});
Qu’on se le tienne pour dit : si vous avez un élément html qui en contient plusieurs autres et que vous voulez agir via Ajax lors des changements, alors AjaxFormChoiceComponentUpdatingBehavior est votre homme !
En espérant vous éviter quelques prises de tête en solitaire autour du thème « J’comprends pas, j’suis informé du changement mais mon modèle n’est pas mis à jour, que passa ?? »
++
Joseph
Content que ça vous plaise !
Et effectivement, gérer l’Ajax depuis le code est vraiment tip top, limite dur à croire avant d’avoir essayé
++
Super
Merci d’avoir partagé : je garde ça au chaud en cas de besoin
loic> Je te le conseille vivement: les simple fait depouvoir spécifier précisément et par programmation ce que tu veux mettre à jour en vaut le coup !
Merci pour l’astuce ca m’a donné envie d’essayer ajax avec wicket!