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。