2009-08-06 5 views
8

Hy, Chcę wyświetlić określoną część (np. Div) mojego szablonu-wicket tylko pod pewnymi warunkami (na przykład tylko wtedy, gdy mam dane do wypełnienia). Problem jest następujący:Wicket: Warunkowe wyświetlanie w szablonie

Jeśli tylko dodaję panel (wypełniając element div), jeśli otrzymałem dane, wyjątek jest generowany za każdym razem, gdy wywoływam stronę bez danych (ponieważ przywoływany identyfikator-bramki nie jest dodawany do drzewo komponentów).

Jedynym rozwiązaniem, które przyszło mi do głowy było dodanie pustego panelu, jeśli nie ma danych. To nie jest idealne rozwiązanie, ponieważ dostałem niepotrzebny kod w kodzie java i wiele pustych elementów div w renderowanym html.

Czy istnieje zatem lepsze rozwiązanie polegające na włączeniu kilku elementów szablonu wicket tylko pod warunkiem?

Odpowiedz

4

Chociaż jest tu stary pytanie może być jeszcze jedno rozwiązanie: wicket:enclosure (i this)

Aktualizacja: Teraz ja potrzebowałem tej funkcji przez mój własny (na jetwick). Używam WebMarkupContainer jeden do stanu loggedin i jeden dla stanu loggedOut i ustawić odpowiednią widoczność:

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); 
} 

Zaletą tego dla mnie jest to, że zapobiega NullpointerExc w // ## zaznaczonej linii i wstaw cecha furtki byłaby dla mnie w tym przypadku bardziej brzydka.

+0

Dzięki, to wydaje się być dobrym rozwiązaniem! – theomega

+0

zobacz moją zaktualizowaną odpowiedź – Karussell

+0

@Karussell, czy istnieje "nowy" brakujący powyżej "innego"? – aioobe

1

Chyba dlatego jest EmptyPanel. Nie wiedząc o twoim kodzie więcej mogę tylko powiedzieć, że to, co myślę, że robisz, jest czymś, co zrobiłbym z kombinacją jakiegoś dziecka z AbstractRepeater i Fragment. Jeśli chcesz powiedzieć więcej o tym, co chcesz zrobić, a także podać kod, z chęcią pomogę ci jak tylko mogę.

0

można wywołać setVisible (fałsz); na komponencie, który chcesz ukryć.

3

Podobnie jak @miaubiz powiedział, możesz wywołać setVisible (false), lub możesz zastąpić metodę isVisible(), jeśli widoczność jest zależna od innego stanu (np. Wypełnione pola).

2

Tak, chcesz przesłonić wartość isVisible. Zachowa to znacznik isVisible = false html z renderowania nawet na końcową stronę html. Ponadto, zgodnie z dokumentami (wymienionymi w EmptyPanel), można użyć WebMarkupContainer jako składnika owijającego.

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

więcej z Dokumenty przejściowymi (https://cwiki.apache.org/WICKET/lifecycle-of-a-wicket-application.html): Component.render() wykonywane są następujące kroki, aby uczynić element: 1. Określ widoczność składnika. Jeśli komponent nie jest widoczny, odpowiedź RequestCycle zostaje zmieniona na NullResponse.getInstance(), , która jest implementacją odpowiedzi, która po prostu odrzuca jej dane wyjściowe. – jgormley