2010-12-04 29 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.detach()を追加します(sampleEntityListModelをfinalにする必要がありますが、これにより余分な状態はシリアライズされません)。これにより、リストビューが要求サイクルの後半にレンダリングされたときに、モデルは新しいデータセットをフェッチします。

0

あなたはおそらく、代わりにそのリンクのAjaxLinkをしたい、とあなたは戦術を使用して、リストの更新をしなければならないが、おそらくウィキがWicketの1.3のコードの代わりに、1.4を持っているという事実のために少しの調整、hereを説明しました。

しかし、RefreshingViewやDataViewなど、別のリピータでもよいでしょう。さまざまなリピータの例がいくつかありますhere。それらのどれもあなたが探しているものではありませんが、そのコードを見ると役に立ちます。

0

問題のように見えますが、あなたのmSampleEntityBA.findAll();間違ったデータを返しています。より多くのコードを見ることなく助けてくれる。

別の注記では、データベースバックアップされたリストで作業するときは、実際にDataViewを使用する必要があります。

0

また、DataViewの代わりにwiQueryプロジェクトからJQGridをチェックアウトすることもできます。

関連する問題