2010-12-04 83 views
2

我正在采取第一步与Apache Wicket并遇到以下问题。我有一个ListView,在其条目旁边显示一个“删除”链接。当单击删除链接时,由列表项目表示的实体将从数据库中删除,但直到我在浏览器中手动重新加载页面,列表本身才会更新。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()); 
       } 
      }); 
     } 
}; 

回答

3

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

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

0

你可能想要一个AjaxLink的而不是链接,然后你必须做出列表刷新,使用的战术描述here,可能调整位为wiki有检票1.3代码,而不是1.4的事实。

但是,使用不同的中继器(例如RefreshingView或DataView)可能会更好。有一些配套的中继器here的例子。虽然他们都不是你正在寻找的东西,但看看这些代码可能会有所帮助。

0

貌似问题在于你的mSampleEntityBA.findAll();正在返回错误的数据。没有看到更多的代码很难帮助。

在不同的笔记中,您应该在使用数据库支持列表时真正使用DataView。

0

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