【问题标题】:wicket - Implement Ajax add/remove items ListViewwicket - 实现 Ajax 添加/删除项目 ListView
【发布时间】:2010-08-18 18:56:43
【问题描述】:

我对这个问题越来越疯狂。我实现了一个 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);

任何帮助将不胜感激,因为我认为这个问题确实是一个非常愚蠢的错误,但我无法理解!

谢谢

【问题讨论】:

    标签: ajax listview wicket


    【解决方案1】:

    这可能就像摆脱线一样简单

    keywordView.setReuseItems(true);
    

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

    ListView 确实不是为使用表单而设计的,你可能会更好地使用另一种策略。

    这个blog entry 关于构建列表编辑器表单组件可能很有用。如果您不在 Wicket 1.4 上,则需要进行一些更改,但类似的东西在 Wicket 1.3 中肯定是可能的,并且 cmets 有一些提示。

    【讨论】:

    • 我不这么认为。在列表视图中使用表单时,您必须重复使用列表项,否则无法找到表单组件。
    • 好吧,我试过了,我工作了!但我认为 bert 说我不能为此目的使用 ListView,因为验证。
    • 我一点也不惊讶它的工作原理。但是 bert 和 seanizer 都是对的,不建议这样做。如果你能理解我链接的博客条目中的内容,它可能比使用 ListView 或 RefreshingView 更好。那个博客是 Wicket 的作者之一。
    • 好吧,最后我要手动实现它,因为我使用任何这些方法都遇到了一些 ajax 验证错误。谢谢大家!
    【解决方案2】:

    阅读 ListView#setReuseItems() 的 javadoc:

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

    【讨论】:

      【解决方案3】:

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

      removeLink(java.lang.String id, ListItem&lt;T&gt; item)

      newItem(int index)

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

      如果您在RefreshingView 中使用FormComponents,请确保设置Reusestartegy (setItemReuseStrategy())

      伯特

      【讨论】:

      • 我知道 removeLink,但它可以在没有 AJAX 的情况下工作! Abour refreshView... 我在 google 中搜索,但没有找到太多关于此的信息,只是 wicket Live Examples 中的一个示例,我得到了一个“过期网络”。你能告诉我如何将我的代码从 ListView 转换为 RefreshinfView 吗?谢谢老哥!
      • 这仍然有效吗?如果是这样,我可以坐下来写一个例子。
      • 新人正在寻找这个问题并等待示例。我是遇到类似问题时发现此问题的示例。
      猜你喜欢
      • 1970-01-01
      • 2013-11-14
      • 2015-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-22
      相关资源
      最近更新 更多