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.