Die Aktualisierung einer datatable in Wicket
Entwickeln wir eine neue Anwendung in Wicket und habe in ein kleines problem.
Was wir tun:
1) erstellen Sie eine neue SortableDataProvider
2) erstellen Sie eine neue DefaultDataTablePagingInBottom
3) erstellen Sie eine neue WebMarkupContainer
4) fügen Sie die DefaultDataTablePagingInBottom der WebMarkupContainer
5) erstellen Sie eine neue AjaxCheckBox
6) in der onUpdate der AjaxCheckBox, fügen Sie die WebMarkupContainer dem AjaxRequestTarget
7) legen Sie die SortableDataProvider zu einem neuen SortableDataProvider (mit der aktualisierten Abfrage)
8) DefaultDataTablePagingInBottom.replaceWith(neue DefaultDataTablePagingInBottom - mit dem neuen Anbieter).
Was happends:
1) Klicken Sie auf die checkbox -> nichts happends.
2) Klicken Sie erneut mit der -> Absturz: "Letzte Ursache: Diese Methode kann nur aufgerufen werden, auf eine Komponente, die bereits Hinzugefügt, um seine Eltern.
WicketMessage: onRequest-Methode der Schnittstelle org.apache.wicket.Verhalten.IBehaviorListener gezielt an org.apache.wicket.ajax.markup.html-Code.form.AjaxCheckBox$1@1a2fefd auf die Komponente [ [Komponenten-id = checkBox]] warf eine Ausnahme"
3) Klicken Sie auf zurück im browser -> die Liste, die ich gefiltert mit dem neuen Anbieter.
Irgendwelche Ideen?
---EDIT---
Hier finden Sie den code.
1) In den Konstruktor der Webseite:
model = new Model(projectPlannerService);
provider = new SortableProjectDataProvider(model, (WebSession) getSession(), isChecked);
table = new DefaultDataTablePagingInBottom("table", columns, provider, 50);
listContainer = new WebMarkupContainer("wmc");
listContainer.add(table);
add(listContainer.setOutputMarkupId(true));
/*
* checkbox för filtrering
*/
AjaxCheckBox checkBox = new AjaxCheckBox("checkBox", new Model()) {
@Override
protected void onUpdate(AjaxRequestTarget target) {
target.add(listContainer, "wmc");
isChecked = !isChecked;
provider = new SortableProjectDataProvider(model, (WebSession) getSession(), isChecked);
updateTable();
}
};
add(checkBox);
2) In updateTable():
table.replaceWith(new DefaultDataTablePagingInBottom("table", columns, provider, 50));
3) Die SortableProjectDataProvider:
//Constructor
public SortableProjectDataProvider(IModel<?> model, WebSession webSession, boolean isChecked) {
this.model = model;
this.projectPlannerService = (ProjectPlannerService) model.getObject();
this.webSession = webSession;
setSort("customer", SortOrder.ASCENDING);
System.out.println("ischecked:" + isChecked);
if(!isChecked)
list = ((ProjectPlannerService) model.getObject()).findAllProjects();
else
list = ((ProjectPlannerService) model.getObject()).findAllActiveProjects();
System.out.println("size: " + list.size());
comparator = new ProjectComparator();
}
public Iterator<Project> iterator(int first, int count) {
Collections.sort(list, comparator);
if (first > list.size()) {
first = 0;
}
if (first + count > list.size()) {
return list.subList(first, list.size()).iterator();
} else {
return list.subList(first, first + count).iterator();
}
}
public IModel<Project> model(Project object) {
return new DetachableProjectModel((Project) object);
}
public int size() {
return list.size();
}
private class DetachableProjectModel extends LoadableDetachableModel {
private Long id;
@SpringBean
ProjectPlannerService projectPlannerService;
public DetachableProjectModel(Long id) {
Injector.get().inject(this);
if (id == null) {
throw new IllegalArgumentException();
}
this.id = id;
}
public DetachableProjectModel(Project project) {
this(project.getPk());
Injector.get().inject(this);
}
public int hashCode() {
return id.hashCode();
}
public boolean equals(final Object obj) {
if (obj == this) {
return true;
} else if (obj == null) {
return false;
} else if (obj instanceof DetachableProjectModel) {
DetachableProjectModel other = (DetachableProjectModel) obj;
return other.id == this.id;
}
return false;
}
protected Object load() {
return ((ProjectPlannerService) model.getObject()).findProjectById(id);
}
}
}
wicket:extend
-input wicket:id="checkBox" type="checkbox" Show active -/input-
-div wicket:id="wmc"-
-table wicket:id="Tabelle"--/Tisch-
- /- div
-/wicket:extend-
Vielen Dank im Voraus!
/Andreas
Die Frage ist schwer zu beantworten ohne den code zu!
InformationsquelleAutor Trezkpadda | 2011-09-08
Du musst angemeldet sein, um einen Kommentar abzugeben.
Durch das ersetzen der Instanz Ihrer
SortableProjectDataProvider
mit einer neuen, Sie machen Ihr das Leben schwer. Anstelle der Verwendung derboolean isChecked
im Konstruktor, den Sie verwenden konnten eineIModel<Boolean>
. Weisen Sie die gleiche Instanz-Modell-Daten-provider und die check-box, und Sie sind fertig. Keine Notwendigkeit, etwas zu ersetzen, inonUpdate
fügen Sie IhrelistContainer
zu denAjaxRequestTarget
und alles soll einfach funktionieren...z.B.
Es ist fast nie eine gute Idee zu ersetzen, die solche Dinge mit neue in Wicket. Kapseln, welche änderungen in einem Modell und ändern /ersetzen Sie die Modell - Objekt. Jedes Objekt, das eine Referenz auf das Modell sehen können, wird der aktualisierte Wert oder ändern Sie Sie nach Bedarf.
Hoffe, das hilft.
InformationsquelleAutor buritos
Versuchen Sie dies:
Falsch: target.add(listContainer, "wmc");
Rechts: target.add(listContainer);
Falsch; Tabelle.replaceWith(neue DefaultDataTablePagingInBottom("Tabelle", Spalten -, provider -, 50));
Rechts: DefaultDataTablePagingInBottom tmp = new DefaultDataTablePagingInBottom("Tabelle", Spalten -, provider -, 50);
Tabelle.replaceWith(tmp);
Tabelle = tmp;
(Sie ersetzen die DefaultDataTablePagingInBottom aber nicht deine Referenz.)
//olle
InformationsquelleAutor bumaklion