Wicket - Wie neu laden/aktualisieren von wiederverwendbaren Komponenten korrekt?
-
Ich habe eine java-Klasse:
public Task { private int id; private Company sender; private Company receiver; //Getter and Setter ... }
Wie Sie sehen können, habe ich 2 andere benutzerdefinierte Klassen, die in der task-Klasse. Und eine Firma hat zum Beispiel die Adresse und das Verzeichnis.
-
Ich habe eine CompanyPanel die wiederverwendbare werden auf der Seite verwendet. Hier ist ein code aus dem panel.
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); } }); } }
-
In der Seite, die ich verwenden reuseable 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); ...
-
Wenn ich das Formular Absenden ich:
public void onSubmit(AjaxRequestTarget target, Form<?> form) { //doSomething target.add(senderPanel); target.add(receiverPanel); }
Das problem: Das Unternehmen panel wird nicht gerendert. Und ich weiß wirklich nicht, warum.
Workflow:
- Wähle ich ein Unternehmen aus der dropdown-panel
- Den Feldern(die im inneren des companyPanel) korrekt eingestellt werden, basierend auf den dropdown -
- Ich ein textField ändern (das gehört zu einer Firma)
- Ich das Formular abschicken
- Ich ändern, das Unternehmen aus der dropdown-Liste
- Ich wieder die erste Firma, > PROBLEM: die geänderten Textfeldern angezeigt, noch der geänderte text im inneren. Es war nicht reseten auf default-Werte.
Jede Hilfe sehr geschätzt.
Ich sehen, fügen Sie dieses Bedienfeld, um Ihre form zu. Wann ist die Seite, die zuerst angezeigt wird, dann können Sie sehen, diese Platten ?
Wird die onSubmit-Methode aufgerufen, in den ersten Platz? Wenn es einen validator Schießen die onError-Methode aufgerufen wird, statt.
Was tun Sie in CompanyPanel?
ja, wenn die Seite geladen ist, ich kann sehen, all die Platten
die onSubmit-Methode wird aufgerufen, in den ersten Platz, ja, wenn der Benutzer sich zuvor auf den button
Wird die onSubmit-Methode aufgerufen, in den ersten Platz? Wenn es einen validator Schießen die onError-Methode aufgerufen wird, statt.
Was tun Sie in CompanyPanel?
ja, wenn die Seite geladen ist, ich kann sehen, all die Platten
die onSubmit-Methode wird aufgerufen, in den ersten Platz, ja, wenn der Benutzer sich zuvor auf den button
InformationsquelleAutor David Sonnenfeld | 2013-01-29
Du musst angemeldet sein, um einen Kommentar abzugeben.
Natürlich werden Sie zeigen die geänderten Werte. Erstellen Sie eine Liste von Unternehmen, die in der CompanyPanel Konstruktor. Wenn Sie ändern die Daten eines Unternehmens, das Objekt geändert wird innerhalb dieser Liste.
Einen schnellen Weg dieses Problem zu beheben wäre, zu ersetzen, die CompanyPanel-panel mit einer neuen Instanz von CompanyPanel in deinem onSubmit-Methode. Das wäre neu die Liste der Unternehmen, die mit Ihren default-Werten. Würden Sie natürlich verlieren Sie die geänderten Werte.
Andere eventuell bessere Lösung ist, verschieben Sie die Unternehmen Listen-Erstellung in das loadabledetachablemodel:
Diese Weise die Liste der Unternehmen ist neu auf jede Anfrage mit den default-Werten.
Stellen Sie sicher, dass Sie implementieren eine ordnungsgemäße equals() und hashCode () - Methode in der Gesellschaft, obwohl für die DropDownChoice zu zeigen, das richtige ausgewählte element obwohl - da in diesem Szenario das Objekt in Ihrem Modell und die Objekte in der Liste können nie ==.
Ich habe die Arbeit mit wicket seit 2006 auf mehreren großen Projekten. Greifen Modell Konzepte ist Teil der Lernkurve.
InformationsquelleAutor cserepj
Musst du mehr code. Wenn Sie uns das korrekt so, dass das Modell änderungen versuchen:
Diese Anrufe sind nicht erforderlich.
InformationsquelleAutor Robert Niestroj