Wicket – No TransparentResolver | wicket praxis
Skip to content


Wicket – No TransparentResolver

Wie ich im letzten Beitrag bereits angkündigt habe, kann man tatsächlich das TransparentResolver-Problem mit Hilfe der verzögerten Initialisierung lösen. Dazu muss die AbstractLazyPanel-Klasse nur ein wenig verändert werden.

 Java(TM) 2 Platform Standard Edition 5.0 | 
 
 copy code |
?

  1. package de.wicketpraxis.web.blog.pages.questions.transparent.lazy;
  2. import org.apache.wicket.Component;
  3. import org.apache.wicket.MarkupContainer;
  4. import org.apache.wicket.markup.html.panel.Panel;
  5. public abstract class AbstractLazyPanel extends Panel
  6. {
  7.   boolean _lazyInitCalled;
  8.   
  9.   public AbstractLazyPanel(String id)
  10.   {
  11.     super(id);
  12.   }
  13.   @Override
  14.   protected void onBeforeRender()
  15.   {
  16.     if (!_lazyInitCalled)
  17.     {
  18.       _lazyInitCalled=true;
  19.       lazyInit();
  20.     }
  21.     super.onBeforeRender();
  22.   }
  23.   protected abstract MarkupContainer lazyInit();
  24. }

Die Methode lazyInit() liefert die Komponente zurück, unter der alle Kindkomponenten eingehangen werden müssen. Das sieht in eigenen Komponenten dann wie folgt aus:

 Java(TM) 2 Platform Standard Edition 5.0 | 
 
 copy code |
?

  1. package de.wicketpraxis.web.blog.pages.questions.transparent.lazy;
  2. import org.apache.wicket.MarkupContainer;
  3. import org.apache.wicket.markup.html.WebMarkupContainer;
  4. public abstract class BasePanel extends AbstractLazyPanel
  5. {
  6.   public BasePanel(String id)
  7.   {
  8.     super(id);
  9.   }
  10.   @Override
  11.   protected MarkupContainer lazyInit()
  12.   {
  13.     WebMarkupContainer border = new WebMarkupContainer("border");
  14.     add(border);
  15.     return border;
  16.   }
  17. }

Hier erstellen wir einen Container, den wir an ein div-Tag binden.

 HTML | 
 
 copy code |
?

  1. <wicket:panel>
  2.   Base
  3.   <div style="border:1px solid blue" wicket:id="border">
  4.     <wicket:child />
  5.   </div>
  6.   Base End
  7. </wicket:panel>

Die davon abgeleitete Klasse sieht dann wie folgt aus:

 Java(TM) 2 Platform Standard Edition 5.0 | 
 
 copy code |
?

  1. package de.wicketpraxis.web.blog.pages.questions.transparent.lazy;
  2. import org.apache.wicket.MarkupContainer;
  3. import org.apache.wicket.markup.html.basic.Label;
  4. import org.apache.wicket.model.Model;
  5. public class SubPanel extends BasePanel
  6. {
  7.   public SubPanel(String id)
  8.   {
  9.     super(id);
  10.   }
  11.   @Override
  12.   protected MarkupContainer lazyInit()
  13.   {
  14.     MarkupContainer root = super.lazyInit();
  15.     root.add(new Label("label",Model.of("Sub")));
  16.     return root;
  17.   }
  18. }

 HTML | 
 
 copy code |
?

  1. <wicket:extend>
  2.   <span wicket:id="label"></span>
  3. </wicket:extend>

Wie man sehen kann, wurde in diesem Beispiel sowohl Markup- als auch Komponentenvererbung benutzt. Trotzdem konnte auf den Einsatz von TransparentResolver verzichtet werden. Die Komponentenhierarchie entspricht der im Markup.

Ich hätte nicht gedacht, dass die Lösung so nahe liegt. Feedback wie immer willkommen…

Posted in Allgemein, Refactoring, Wicket.

Tagged with , , , .


0 Responses

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



Some HTML is OK

or, reply to this post via trackback.