juin
2009
Je viens de perdre une demi heure à me casser les dents sur un truc très stupide. Je voulais donc en parler rapidement ici, peut être que ça vous épargnerait de perdre du temps dessus un de ces jours.
La version courte
Ne jamais utiliser <wicket:container> avec l’ajax !!!!
La version longue
J’ai mis dans le html :
<wicket:container wicket:id=details"></wicket:container>
Côté Java, j’y avais associé un EmptyPanel (initialement) :
add(new EmptyPanel("details").setOutputMarkupId(true));
Et je voualis mettre à jour son contenu via ajax suite à un clic sur un autre élément de la page :
PersonDetailsPanel personDetailsPanel = new PersonDetailsPanel(
"details", new Model<Person>(p));
personDetailsPanel.setOutputMarkupId(true);
addOrReplace(personDetailsPanel);
if (target != null) {
target.addComponent(new PersonDetailsPanel(
"details", new Model<Person>(p)).setOutputMarkupId(true));
}
A l’exécution, j’obtiens un comportement bizarre : Au premier clic, ça met à jour la page html, mais les clics suivants bien que traités côté serveur ne mettent pas à jour le panel.
D’autres fois, même le premier clic ne fonctionnait pas.
Pour finir, je tiens à adresser mes remerciements les plus sincères à la console «Ajax Debug» de Wicket qui m’a permis de résoudre ce problème ! :))
Bonjour,
Il ne faut pas utiliser un
pour mettre à jour son contenu en ajax car c’est une balise qui disparait lorsque vous passez vos applications wicket en production (deployment) : si la balise disparait, wicket ne saura pas mettre à jour sont contenus en ajax.
D’autre part à la page suivante, à la section
, il est indiqué qu’il ne faut pas utiliser une telle balise pour de la maj en ajax :p
http://cwiki.apache.org/WICKET/wickets-xhtml-tags.html
@zedros : j’ai utilisé un div à la place de et non, ce n’est pas un composant liste que je veux rafraichir via ajax.
Le problème n’est pas que je n’ai pas un composant Wicket à passer à l’AjaxRequestTarget, c’st plutot dans le html où Wicket ne trouve pas la balise où insérer le contenu du composant.
petite question : quelle solution as tu retenu finalement ?
s’il s’agit d’une listview, perso, j’ai tendance à la mettre dans un container quelconque, genre un webmarkupcontainer, histoire de mettre ce composant dans ma target.
@lunatix> Oui, je peux le faire, mais c’est pas ça le problème : on passe par le WebMarkupContainer généralement quand on veut refraichir une balise qui n’a pas de composant Wicket associé via Ajax.
Là c’est plutot l’inverse : je voualis rafraichir un composant qui n’était pas associé à une balise :aie:
tu dois pouvoir utiliser WebMarkupContainer je crois? (zut, je me rends compte que ca fait un petit moment que j’ai plus fait de wicket, j’ai un peu perdu la main)
j’viens de vérifier ce n’est que pour les composants qui… ont un tag lol
dsl pour la fausse piste
++
Plop,
Ouep, c’est pas faux.
Sinon, j’ai plutôt utilisé un div à la place du container, mais ta proposition est intéressante. Je vais tester ça
[edit] Ca marche pas.
salut
hum, je ne suis pas trop surpris dans la mesure où tout l’intérêt d’un wicket:container est de ne pas figurer dans l’html généré…
Aussi, du coup, perso, j’aurai plutôt utilisé setOutputMarkupPlaceholderTag(true)… As tu essayé ?
++