Skip to content


Modell-Referenzen

Wie zeige ich eine Liste von Elementen und die Länge der Liste mit Wicket an, ohne dass ich die Liste zweimal erzeugen muss?

Für die Liste würde man ein LoadableDetachableModel benutzen und in load() das Ergebnis zurückliefern.

 Java |  copy code |? 
1
final LoadableDetachableModel<List<Something>> modelListe = new LoadableDetachableModel<List<Something>>()
2
{
3
  @Override
4
  protected List<Something> load()
5
  {
6
    return Something.asList();
7
  }
8
};

Für die Anzahl der Einträge würde ich jetzt auf dieses Modell zurückgreifen:
 Java |  copy code |? 
01
LoadableDetachableModel<Integer> modelAnzahl = new LoadableDetachableModel<Integer>()
02
{
03
  @Override
04
  protected Integer load()
05
  {
06
    return modelListe.getObject().size();
07
  }
08
 
09
  @Override
10
  public void detach()
11
  {
12
    modelListe.detach();
13
    super.detach();
14
  }
15
};

Wenn modelListe nicht mit einer Wicketkomponente verbunden wäre, würde detach für diese Modell nie aufgerufen und die Liste damit nicht neu erzeugt. Änderungen an der Liste würden sich nicht sofort in der Anzeige wiederspiegeln. Daher muss man in dem Modell, dass mit einer Wicketkomponente verbunden ist auch detach für alle referenzierten Modelle aufrufen. Es gibt eine einfachere Lösung:
 Java |  copy code |? 
01
public abstract class CascadingLoadableDetachableModel<M,P> extends LoadableDetachableModel<M>
02
{
03
  IModel<P> _parent;
04
 
05
  public CascadingLoadableDetachableModel(IModel<P> parent)
06
  {
07
    super();
08
    _parent=parent;
09
  }
10
 
11
  @Override
12
  public void detach()
13
  {
14
    super.detach();
15
    _parent.detach();
16
  }
17
 
18
  @Override
19
  protected M load()
20
  {
21
    return load(_parent.getObject());
22
  }
23
 
24
  protected abstract M load(P parentModelData);
25
}

Man übergibt die Modell-Referenz im Konstruktor, bekommt die Modell-Daten automatisch als Methodenparameter und detach wird auch automatisch aufgerufen:
 Java |  copy code |? 
1
CascadingLoadableDetachableModel<Integer,List<Something>> modelAnzahl = new CascadingLoadableDetachableModel<Integer,List<Something>>()
2
{
3
  @Override
4
  protected Integer load(List<Something> parentModelData)
5
  {
6
    return parentModelData.size();
7
  }
8
};

Schön kurz.

Share and Enjoy:
  • Digg
  • Sphinn
  • del.icio.us
  • Facebook
  • Mixx
  • Google Bookmarks

Andere Beiträge

Posted in Wicket.

Tagged with , , , .


3 Responses

Stay in touch with the conversation, subscribe to the RSS feed for comments on this post.

  1. Tweetback! @wicketpraxis says

    New blog post: Modell-Referenzen http://tinyurl.com/6ufou7

Continuing the Discussion

  1. Migration zu Wicket: Model | wicket praxis linked to this post on 22. September 2009

    [...] Die Beispielliste ist eine Liste von Posten auf einer Rechnung. Wir möchten aber zum Betrag auch noch den MwSt-Anteil ausweisen. Dazu schreiben wir ein allgemeines Model, dass von einer Erweiterung des LoadableDetachableModel abgeleitet ist: CascadingLoadableDetachableModel. [...]

  2. Wicket Model Transformation | wicket praxis linked to this post on 28. Oktober 2009

    [...] auf die bereits geladenen Daten aus dem Model zurückzugreifen. Für diesen Zweck kann man auf eine spezialisierte Model-Klasse zurückgreifen, die sich darum kümmert, das die detach()-Methode auch für alle referenzierten [...]



Some HTML is OK

or, reply to this post via trackback.