wicket - 实现Ajax添加/删除项ListView

时间:2010-08-18 18:56:43

标签: ajax listview wicket

我对这个问题感到疯狂。我实现了一个ListView,您可以在其中添加/删除TextField,但只删除最后一个TextField。

一个例子:

// Object type which is used in the list
public class ExampleObject implements Serializable{
    private String keyword;

    public String getKeyword() {
        return this.keyword;
    }

    public void setKeyword(String s) {
        keyword = s;
    }
}

//ListView
List<ExampleObject> keywordList = new ArrayList<ExampleObject>();
keywordList.add(new ExampleObject());

ListView keywordView = new ListView("keywordView", keywordList) {
    @Override
    protected void populateItem(final ListItem item) {
            ExampleObject model = (ExampleObject) item.getModelObject();
            item.add(new TextField("subKeyword", new PropertyModel(model, "keyword")));

            // keyword remove link
            AjaxSubmitLink removeKeyword = new AjaxSubmitLink("removeKeyword", myForm)         
            {
                @Override
                protected void onSubmit(AjaxRequestTarget target, Form<?> form) {
                    ExampleObject selected = (ExampleObject) item.getModelObject();
                    // I also tried deleting by index. println shows the
                    // selected object is the element I want to remove, so why always
                    // remove last object of the list?
                    keywordList.remove(selected);
                    if (target != null) {
                        target.addComponent(myForm);
                    }
                }
            };

            item.add(removeKeyword);

            // keyword add link
            AjaxSubmitLink addKeyword = new AjaxSubmitLink("addKeyword", metadataForm)      
                {
                @Override
                protected void onSubmit(AjaxRequestTarget target, Form<?> form) {
                    keywordList.add(new ExampleObject());
                    if (target != null) {
                        target.addComponent(myForm);
                    }
                }
            };
            item.add(addKeyword);
}
keywordView.setReuseItems(true);
metadataForm.add(keywordView);

任何帮助都会非常感激,因为我认为这个问题确实是一个非常愚蠢的错误,但我无法得到它!

由于

3 个答案:

答案 0 :(得分:5)

这可能就像摆脱行

一样简单
keywordView.setReuseItems(true);

reuseItems标志是一种效率,因此页面不会不必要地重建ListView项目,但它可能会导致混淆,例如您所看到的内容。

ListView实际上并不是用于表格,而且你可能会完全采用另一种策略。

构建列表编辑器表单组件的blog entry可能很有用。如果你不在Wicket 1.4上,它将需要一些改变,但在Wicket 1.3中肯定有类似的东西,并且评论有一些提示。

答案 1 :(得分:1)

您不能以这种方式使用ListView。使用ListView提供的成员:

removeLink(java.lang.String id, ListItem<T> item)

newItem(int index)

但是,我从未使用过那些。如果我必须显示List并且能够动态添加移除项目,我更喜欢RefreshingView

如果您在FormComponents内使用RefreshingView,请务必设置Reusestartegy (setItemReuseStrategy())

伯特

答案 2 :(得分:1)

读取ListView#setReuseItems()的javadoc:

“但是如果修改listView模型对象,则必须手动调用listView.removeAll()才能重建ListItems。”