Java 如何使用AjaxLink更新Wicket Listview?

Java 如何使用AjaxLink更新Wicket Listview?,java,ajax,wicket,Java,Ajax,Wicket,我想通过Ajax链接用新闻条目更新我的ListView。我有一个每个月的链接,点击后,我想显示特定月份的新闻 我尝试了本教程,但不起作用: 以下是我的代码示例: add(new Label("title", "News Archive")); List<NewsEntry> newsEntries = new ArrayList<NewsEntry>(); final ListView<NewsEntry> listview =

我想通过Ajax链接用新闻条目更新我的ListView。我有一个每个月的链接,点击后,我想显示特定月份的新闻

我尝试了本教程,但不起作用:

以下是我的代码示例:

    add(new Label("title", "News Archive"));

    List<NewsEntry> newsEntries = new ArrayList<NewsEntry>();

    final ListView<NewsEntry> listview = new ListView<NewsEntry>(
            "newsItem", newsEntries)
    {
        private static final long serialVersionUID = -4294698878214798680L;

        @Override
        protected void populateItem(final ListItem<NewsEntry> item)
        {
            Link<Void> link = new Link<Void>("newsItemLinkID")
            {
                private static final long serialVersionUID = 6176760893378172041L;

                @Override
                public void onClick()
                {
                    setResponsePage(getPage());
                }
            };

            link.add(new Label("newsItemLinkName", item.getModelObject()
                    .getHeadline()));
            link.setOutputMarkupId(true);
            item.add(link);
        }
    };
    listview.setOutputMarkupId(true);
    add(listview);

    add(new AjaxLink<Object>("march")
    {
        private static final long serialVersionUID = 974013580329804810L;

        @Override
        public void onClick(AjaxRequestTarget target)
        {
            NewsDAO news = new NewsDAO();
            listview.setList(news.getNewsFromMonth(MONTH.MARCH));
            target.addChildren(listview, Link.class);
        }
    });
添加(新标签(“标题”、“新闻档案”); 列表新闻条目=新建ArrayList(); 最终ListView ListView=新ListView( “新闻项目”,新闻条目) { 私有静态最终长serialVersionUID=-4294698878214798680L; @凌驾 受保护的无效填充项(最终列表项) { Link Link=新链接(“newsItemLinkID”) { 私有静态最终长serialVersionUID=6176760893378172041L; @凌驾 公共void onClick() { setResponsePage(getPage()); } }; 添加(新标签(“newsItemLinkName”,item.getModelObject()) .getHeadline()); link.setOutputMarkupId(true); 添加(链接); } }; setOutputMarkupId(true); 添加(列表视图); 新增(新AjaxLink(“三月”) { 私有静态最终长serialVersionUID=974013580329804810L; @凌驾 公共void onClick(AjaxRequestTarget目标) { NewsDAO news=NewsDAO(); setList(news.getNewsFromMonth(MONTH.MARCH)); addChildren(listview,Link.class); } });
目前,不会显示任何内容。我没有收到任何错误,无论是在ajax调试窗口中,还是在我的eclipse控制台中。我现在有点卡住了,不知道出了什么问题。

您应该将ListView包装到WebMarkupContainer中,并更新此容器而不是ListView

WebMarkupContainer wmc = new WebMarkupContainer("listWmc");
add(wmc);

// init your listView
// ...

wmc.add(listView);

对此有一点解释:如果您查看listview的生成标记,您将看到它不是一个HTML元素,而是几个(每个项目一个)。由于Wicket的Ajax模型是基于替换元素的,因此要更新它是有问题的。添加包装
WebMarkupContainer
并对其进行更新可以解决此问题。我正在尝试更新WebMarkupContainer的模型(CompoundPropertyModel)。在AjaxLink的onClick处理程序中,只需将WebMarkupContainer添加到AjaxRequestTarget->target.add(wmc)中;