Wicket - Comment rafraîchir composants réutilisables correctement?
- J'ai une classe java:
public Task { private int id; private Company sender; private Company receiver; //Getter and Setter ... }
Comme vous pouvez le voir, j'ai 2 autres classes personnalisées dans la classe de tâche. Et l'entreprise a, par exemple, l'Adresse et le Répertoire.
- J'ai un CompanyPanel qui sera réutilisable être utilisées sur la Page. Voici un peu de code à partir du panneau.
public class CompanyPanel extends Panel { protected List<Company> companies; public CompanyPanel(String id, IModel<Company> model) { super(id,new CompoundPropertyModel<Company>(model)); companies = new ArrayList<Company>(); Company company_1 = new Company(); //Setting default predefined values for the company, so I can select it from the dropdown and to set fields automatically company_1.setFtpAdress("adress1.com"); company_1.setFtpDir("/MusterDir/"); companies.add(company_1); //SAME for another company ... companies.add(comany_2); ... final DropDownChoice<Company> companyList = new DropDownChoice<Company>("companies", model, new LoadableDetachableModel<List<Company>>() { @Override protected List<Company> load() { return companies; } }){ protected boolean wantOnSelectionChangedNotifications() { return true; } }; add(companyList); final TextField<String> ftpAdress = new TextField<String>("ftpAdress"); ftpAdress.setOutputMarkupId(true); add(ftpAdress); final TextField<String> ftpDir = new TextField<String>("ftpDir"); ftpDir.setOutputMarkupId(true); add(ftpDir); //added Ajax to dropdown to update textfields automatically, based on selection of dropdown companyList.add(new AjaxFormComponentUpdatingBehavior("onchange") { @Override protected void onUpdate(AjaxRequestTarget target) { target.add(ftpAdress); target.add(ftpDir); } }); } }
- Dans la Page-je utiliser réutilisables CompanyPanels.
... CompanyPanel senderPanel = new CompanyPanel("senderPanel", new PropertyModel(task,"sender")); senderPanel.setOutputMarkupId(true); form.add(senderPanel); CompanyPanel receiverPanel = new CompanyPanel("receiverPanel", new PropertyModel(task,"receiver")); receiverPanel.setOutputMarkupId(true); form.add(receiverPanel); ...
- Quand je soumettre le formulaire je fais:
public void onSubmit(AjaxRequestTarget target, Form<?> form) { //doSomething target.add(senderPanel); target.add(receiverPanel); }
Le problème: La société n'est pas d'être réaffichées. Et je ne sais pas vraiment pourquoi.
Flux de travail:
- J'sélectionnez une entreprise dans la liste déroulante du panneau
- Les objets textfield(qui sont à l'intérieur de la companyPanel) sera réglée correctement, basé sur la liste déroulante
- - Je modifier un textField (qui appartient à une société)
- - Je soumettre le formulaire
- - Je changer la société à partir de la liste déroulante
- Je revenir à la première compagnie -> PROBLÈME: la modification de textfields affiche toujours le texte modifié de l'intérieur. Il n'a pas été réinitialisées aux valeurs par défaut.
Toute aide très appréciée.
Je vois que vous l'ajouter à votre formulaire de trop. Lorsque la page est tout d'abord affiche ensuite, vous pouvez voir ce panneau ?
Est le onSubmit méthode appelée en premier lieu? Si il y a un validateur de tir la onError méthode est appelée à la place.
Que faites-vous dans CompanyPanel?
oui, lorsque la page est chargée, je peux voir tous les panneaux
le onSubmit méthode est appelée en premier lieu, oui, lorsque l'utilisateur appuie sur le bouton
Est le onSubmit méthode appelée en premier lieu? Si il y a un validateur de tir la onError méthode est appelée à la place.
Que faites-vous dans CompanyPanel?
oui, lorsque la page est chargée, je peux voir tous les panneaux
le onSubmit méthode est appelée en premier lieu, oui, lorsque l'utilisateur appuie sur le bouton
OriginalL'auteur David Sonnenfeld | 2013-01-29
Vous devez vous connecter pour publier un commentaire.
Bien sûr, ils vont afficher les valeurs modifiées. Vous créez une liste d'entreprises dans le CompanyPanel constructeur. Lorsque vous modifiez les données d'une société, l'objet est modifié à l'intérieur de cette liste.
Un moyen rapide de résoudre ce serait de remplacer le CompanyPanel panneau avec une nouvelle instance de CompanyPanel dans votre méthode onSubmit. Qui recrée la liste des sociétés avec vos valeurs par défaut. Bien entendu, vous perdez les valeurs modifiées.
Un autre, éventuellement, une meilleure solution est de déplacer les entreprises de création de liste dans le loadabledetachablemodel:
Cette façon, la liste des entreprises est recréé à chaque requête avec les valeurs par défaut.
Assurez-vous de mettre en œuvre une bonne equals() et hashCode() la méthode dans l'Entreprise, bien que pour DropDownChoice pour montrer le bon élément sélectionné si - parce que, dans ce scénario, l'objet de votre modèle, et les objets de la liste ne peut jamais être ==.
J'ai travaillé avec wicket depuis 2006 dans plusieurs grands projets. Saisir les concepts de modèles est la partie de la courbe d'apprentissage.
OriginalL'auteur cserepj
Vous devez fournir plus de code. Si vous soumettez le correctement de sorte que les modifications apportées au modèle d'essayer:
Ces appels ne sont pas nécessaires.
OriginalL'auteur Robert Niestroj