2009-08-06 10 views
8

Hy, Ich möchte ein bestimmtes Teil (zB ein div) meiner Wicket-Vorlage nur unter einer bestimmten Bedingung anzeigen (zB nur wenn ich die Daten dafür habe). Das Problem ist:Wicket: Bedingte Anzeige im Template

Wenn ich nur das Panel (Füllen der Div) hinzufügen, wenn ich die Daten bekam, wird eine Ausnahme jedes Mal ausgelöst, wenn ich die Seite ohne die Daten aufrufen (weil die referenzierte Wicket-ID nicht hinzugefügt wird Komponentenbaum).

Die einzige Lösung, die mir in den Sinn kam, war ein leeres Panel hinzuzufügen, wenn keine Daten vorhanden sind. Dies ist keine ideale Lösung, da ich nicht benötigten Code im Java-Code und viele leere divs in meinem gerenderten HTML-Code habe.

Gibt es also eine bessere Lösung, mehrere Teile einer Wicket-Vorlage nur unter einer Bedingung aufzunehmen?

Antwort

4

Obwohl dies eine alte Frage hier ist, könnte eine weitere Lösung: wicket:enclosure (und this)

aktualisieren: Jetzt brauchte ich diese Funktionalität von mir selbst (für jetwick). Ich verwende WebMarkupContainer eine für LoggedIn Zustand und einen für LoggedOut Zustand und stellen Sie die richtige Sichtbarkeit:

if (loggedIn()) {    
    WebMarkupContainer loggedInContainer = new WebMarkupContainer("loggedIn"); 
    //## do something with the user 
    User user = getUserSomeWhere(); 
    loggedInContainer.add(new UserSearchLink("userSearchLink")); 
    add(loggedInContainer); 
    add(WebMarkupContainer("loggedOut").setVisible(false)); 
} else { 
    add(new WebMarkupContainer("loggedIn").setVisible(false)); 
    WebMarkupContainer loggedOutContainer = WebMarkupContainer("loggedOut"); 
    loggedOutContainer.add(new LoginLink() {...}); 
    add(loggedOutContainer); 
} 

Dies hat den Vorteil für mich ist, dass ich eine NullpointerExc in der // ## markierten Linie und der enclose verhindern Das Feature von Wicket würde mir in diesem Fall hässlicher aussehen, denke ich.

+0

Danke, das scheint eine gute Lösung zu sein! – theomega

+0

siehe meine aktualisierte Antwort – Karussell

+0

@Kussell, gibt es ein 'neues' direkt über dem' else'? – aioobe

1

Ich denke, deshalb gibt es EmptyPanel. Ohne etwas über deinen Code zu wissen, kann ich nur sagen, dass das, was ich denke, du tust, etwas ist, was ich mit der Kombination einiger Kinder von AbstractRepeater und Fragment machen würde. Wenn Sie bereit sind, mehr darüber zu erfahren, was Sie tun möchten, und vielleicht auch etwas Code zur Verfügung stellen, werde ich Ihnen gerne weiterhelfen.

0

können Sie setVisible aufrufen (false); auf der Komponente, die Sie ausblenden möchten.

3

Wie @miaubiz sagte, können Sie setVisible (false) aufrufen, oder Sie können die isVisible() -Methode überschreiben, wenn die Sichtbarkeit von einem anderen Status abhängig ist (z. B. Felder gefüllt).

2

Yup, Sie möchten isVisible überschreiben. Dadurch wird das isVisible = false html-Markup vom gleichmäßigen Rendern auf die endgültige HTML-Seite beibehalten. Gemäß den Dokumenten (erwähnt in EmptyPanel) können Sie auch die als Umhüllungskomponente verwenden.

this.add(new SimpleResourceModelLabel(NO_DATA_LABEL){ 
     private static final long serialVersionUID = 1L; 

     @Override 
     public boolean isVisible() { return myList.isEmpty(); } 
    }); 

    final WebMarkupContainer table = new WebMarkupContainer(MY_DATA_TABLE){ 
     private static final long serialVersionUID = 1L; 

     @Override 
     public boolean isVisible() { return !myList.isEmpty(); } 
    }; 
+0

Weitere von den Wicket-Dokumente (https://cwiki.apache.org/WICKET/lifecycle-of-a-wicket-application.html): Component.render() folgt vor, um eine Komponente zu machen: 1. Bestimmen Sie die Sichtbarkeit der Komponenten. Wenn die Komponente nicht sichtbar ist, wird die Antwort des RequestCycle in NullResponse.getInstance() geändert, , was eine Response-Implementierung ist, die einfach ihre Ausgabe verwirft. – jgormley