Wicket ListView不令人耳目一新

时间:2010-12-04 13:30:50

标签: java wicket

我正在使用Apache Wicket迈出第一步并遇到以下问题。我有ListView,在其条目旁边显示“删除”链接。单击删除链接时,列表项表示的实体将从数据库中删除,但在我在浏览器中手动重新加载页面之前,列表本身不会更新。

IModel<List<SampleEntity>> sampleEntityListModel = new LoadableDetachableModel<List<SampleEntity>>() {
        @Override
        protected List<SampleEntity> load() {
            return mSampleEntityBA.findAll();
        }
    };

mListview = new ListView<SampleEntity>("listview", sampleEntityListModel) {
        @Override
        protected void populateItem(final ListItem<SampleEntity> item) {
            item.add(new Label("listlabel", new PropertyModel<String>(item.getModelObject(),
                    "text")));
            item.add(new Link<SampleEntity>("deleteLink", item.getModel()) {
                @Override
                public void onClick() {
                    mSampleEntityBA.delete(item.getModelObject());
                }
            });
        }
};

4 个答案:

答案 0 :(得分:3)

当调用onClick时,item.getModelObject()从sampleEntityListModel中拉出,而sampleEntityListModel又调用mSampleEntityBA.findAll()。 sampleEntityListModel的模型对象将在请求周期的持续时间内缓存(直到它被分离 - 这通常是你想要的)并且不知道对delete()的调用。

为了刷新sampleEntityListModel,在删除之后添加一个sampleEntityListModel.detach()调用(必须使sampleEntityListModel成为final,但这不会导致任何额外的状态被序列化)。这将导致模型在请求周期中稍后呈现列表视图时获取一组新数据。

答案 1 :(得分:0)

你可能想要一个AjaxLink而不是那个Link,然后你必须使用here所描述的策略刷新列表,可能会因wiki有Wicket 1.3代码而不是1.4而调整一下

但是使用不同的转发器(例如RefreshingView或DataView)也可能会更好。有一些各种中继器here的例子。虽然它们都不是您正在寻找的,但查看该代码可能有所帮助。

答案 2 :(得分:0)

看起来问题是你的mSampleEntityBA.findAll();返回不正确的数据。没有看到更多代码就很难提供帮助。

另外,在使用数据库支持的列表时,您应该真正使用DataView。

答案 3 :(得分:0)

您可能还想从wiQuery项目而不是DataView中查看JQGrid。