2010-12-04 15 views
2

Ich mache meine ersten Schritte mit Apache Wicket und stieß auf das folgende Problem. Ich habe eine ListView, die einen "Löschen" -Link direkt neben seinen Einträgen anzeigt. Wenn auf den Link zum Löschen geklickt wird, wird das durch das Listenelement dargestellte Element aus der Datenbank gelöscht, aber die Liste selbst wird erst aktualisiert, wenn ich die Seite im Browser manuell neu lade.Wicket ListView nicht erfrischend

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()); 
       } 
      }); 
     } 
}; 

Antwort

3

Wenn onClick aufgerufen wird, ruft item.getModelObject() das sampleEntityListModel ab, das wiederum mSampleEntityBA.findAll() aufruft. Das Modellobjekt von sampleEntityListModel wird für die Dauer des Anforderungszyklus zwischengespeichert (bis es losgelöst wird - was normalerweise der Fall ist) und den Aufruf von delete() nicht kennt.

Um das sampleEntityListModel zu aktualisieren, fügen Sie einen sampleEntityListModel.detach() - Aufruf direkt nach dem Löschen hinzu (sampleEntityListModel muss endgültig gemacht werden, aber dadurch wird kein zusätzlicher Status serialisiert). Dies führt dazu, dass das Modell einen neuen Datensatz abruft, wenn die Listenansicht später im Anforderungszyklus gerendert wird.

0

Sie wollen wahrscheinlich eine AjaxLink statt diesen Link, und dann müssen Sie die Liste zu aktualisieren machen, indem die Taktik here beschrieben, möglicherweise ein wenig für die Tatsache, Einstellung, dass das Wiki Wicket 1.3 Code hat statt 1,4 .

Aber Sie könnten auch mit einem anderen Repeater, wie einem RefreshingView oder einem DataView, besser dran sein. Es gibt einige Beispiele für verschiedene Repeater here. Obwohl keiner von ihnen genau das ist, wonach Sie suchen, hilft Ihnen der Blick auf diesen Code.

0

sieht aus wie das Problem ist, dass Ihre mSampleEntityBA.findAll(); gibt falsche Daten zurück. schwer zu helfen, ohne mehr Code zu sehen.

mit einer anderen Anmerkung, sollten Sie wirklich DataView verwenden, wenn Sie mit datenbankgestützten Listen arbeiten.

0

Sie können auch JQGrid aus dem wiQuery-Projekt anstelle von DataView auschecken.

Verwandte Themen