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

Poste bitte etwas code
Die Frage ist schwer zu beantworten ohne den code zu!

InformationsquelleAutor Trezkpadda | 2011-09-08

Schreibe einen Kommentar