在Wicket中更新数据表

时间:2011-09-08 14:15:56

标签: ajax datatable wicket

我们正在Wicket开发一个新的应用程序并遇到了一个小问题。

我们做什么:

1)创建一个新的SortableDataProvider
2)创建一个新的DefaultDataTablePagingInBottom
3)创建一个新的WebMarkupContainer
4)将DefaultDataTablePagingInBottom添加到WebMarkupContainer
5)创建一个新的AjaxCheckBox
6)在AjaxCheckBox的onUpdate中,将WebMarkupContainer添加到AjaxRequestTarget
7)将SortableDataProvider设置为新的SortableDataProvider(具有更新的查询)
8)DefaultDataTablePagingInBottom.replaceWith(new DefaultDataTablePagingInBottom - 使用新的提供者)。

发生了什么:

1)点击复选框 - &gt;一切都没有发生 2)再次点击它 - &gt;崩溃:“最后一个原因:此方法只能在已添加到其父级的组件上调用 WicketMessage:方法onRequest的接口org.apache.wicket.behavior.IBehaviorListener,目标是组件[[Component id = checkBox]]上的org.apache.wicket.ajax.markup.html.form.AjaxCheckBox$1@1a2fefd引发异常“<登记/> 3)在浏览器中单击返回 - &gt;我用新提供商过滤的列表。

有什么想法吗?

--- --- EDIT 这是一些代码。

1)在WebPage的构造函数中:

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)在updateTable()中:

table.replaceWith(new DefaultDataTablePagingInBottom("table", columns, provider, 50));

3)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);
    }
}

}

便门:延伸
   -input wicket:id =“checkBox”type =“checkbox” - 显示活动 - /输入 -
   -div wicket:id =“wmc” -
   -table wicket:id =“table” - / table-
    - / div-
- /检票:extend-

提前致谢!
/安德烈亚斯

2 个答案:

答案 0 :(得分:1)

SortableProjectDataProvider的实例替换为新实例会让您的生活变得困难。您可以使用boolean isChecked而不是在构造函数中使用IModel<Boolean>。将该模型的相同实例分配给数据提供者和复选框,您就完成了。无需替换onUpdate中的任何内容,将listContainer添加到AjaxRequestTarget,一切都应该正常工作......

e.g。

...

private IModel<Boolean> isCheckedModel = new Model<Boolean>(Boolean.FALSE);

...

provider = new SortableProjectDataProvider(model, (WebSession) getSession(), isCheckedModel);

...

AjaxCheckBox checkBox = new AjaxCheckBox("checkBox", isCheckedModel) {

    @Override
    protected void onUpdate(AjaxRequestTarget target) {
        target.add(listContainer);
    }
};

...

在Wicket中用新的东西替换这些东西几乎不是一个好主意。封装模型中的更改并更改/替换模型的对象。每个引用该模型的对象都可以看到更新后的值或根据需要进行更改。

希望这有帮助。

答案 1 :(得分:0)

试试这个:

错误:target.add(listContainer,“wmc”);
右:target.add(listContainer);

错误; table.replaceWith(new DefaultDataTablePagingInBottom(“table”,columns,provider,50));
右:DefaultDataTablePagingInBottom tmp = new DefaultDataTablePagingInBottom(“table”,columns,provider,50);
        table.replaceWith(TMP);
        table = tmp;
(您替换DefaultDataTablePagingInBottom但不替换您的引用。)

//奥莱