Unabhängige Wicket-Elemente zusammen ausblenden

Wickets setVisible bzw. setVisibityAllowed kann sehr sperrig sein, wenn man mehrere DOM-Elemente ausblenden möchte, weil ein einzelnes nicht befüllt werden kann. Ist ein beispielsweise ein Autor nicht angegeben, so braucht auch die Beschriftung „Autor“ vor diesem Feld nicht erscheinen:

<dl>
  <!-- dt sollte nur sichtbar sein, wenn auch dd sichtbar ist: -->
  <dt>Autor</dt> 
  <dd wicket:id="author">Klaus</dd>
  <!-- hier analog: -->
  <dt>Veröffentlicht am</dt>
  <dd wicket:id="published">11.11.2012</dd>
</dl>

Ist kein Autor für author angegeben, so soll auch das vorangegangene <dt> nicht angezeigt werden. Nun ließe sich auch die Überschrift als Component realisieren und die Sichtbarkeit im Java-Code prüfen, Wicket bietet von Haus aus aber eine einfachere und schönere Lösung.

<wicket:enclosure>

<dl>
  <wicket:enclosure child="author">  
    <dt>Autor</dt>
    <dd wicket:id="author">Klaus</dd>
  </wicket:enclosure>
  <wicket:enclosure child="published">
    <dt>Veröffentlicht am</dt>
    <dd wicket:id="published">11.11.2012</dd>
  <wicket:enclosure>
</dl>

Ein <wicket:enclosure>-Element erstellt einen (im generierten HTML unsichtbaren) Container. Dessen Inhalt ist nur dann sichtbar, wenn die im child-Attribut referenzierte Komponente sichtbar ist. Im Beispiel führt ein Unsichtbarschalten einer <dd>-Komponente folglich dazu, dass auch das <dt>-Element nicht im Quelltext erscheint.

Da im Beispiel nur eine Kompontente innerhalb eines <wicket:enclosure>-Elements liegt, kann das child-Attribut auch weggelassen werden.

Enclosure als Attribut

In vielen Umgebungen sind die zusätzlichen <wicket:enclosure>-Tags störend und unnötig. Wicket bringt hierfür ein Attribut mit, welches das selbe leistet, sich aber besser integriert.

<table>
  <tr wicket:enclosure="author">
    <td>Autor</td>
    <td><span wicket:id="author">Klaus</span></td>
  </tr>
  <tr wicket:enclosure="published">
    <td>Veröffentlicht am</td>
    <td><span wicket:id="published">11.11.2012</span></td>
  </tr>
</table>

Beschränkungen

Wickets Enclosure-Funktionalität ist zwar sehr hilfreich, kann jedoch oft nicht eingesetzt werden. Schon die angegebenen Beispiele zeigen das Problem: Ob als Definitionsliste oder Tabelle, beide Ansätze erfordern, dass das Elternelement <dl> bzw. <table> nicht erscheint, wenn keine der Kindkomponenten sichtbar ist.

<!-- Funktioniert NICHT: -->
<table wicket:enclosure="author || published">
  <tr wicket:enclosure="author">
    <td>Autor</td>
    <td><span wicket:id="author">Klaus</span></td>
  </tr>
  <tr wicket:enclosure="published">
    <td>Veröffentlicht am</td>
    <td><span wicket:id="published">11.11.2012</span></td>
  </tr>
</table>

Stattdessen müssen in solchen Situationen größere Geschütze wie ListView aufgefahren werden. Eigentlich schade um das Potential.