2009-08-06 12 views
8

Hy, Desidero visualizzare una determinata parte (un div per esempio) del mio wicket-template solo in una determinata condizione (ad esempio solo se ho i dati per riempirlo). Il problema è:Wicket: display condizionale in Template

Se aggiungo solo il pannello (riempiendo il div) se ho ricevuto i dati, viene generata un'eccezione ogni volta che chiamo la pagina senza i dati (perché il wicket-id di riferimento non viene aggiunto al componente-albero).

L'unica soluzione che mi è venuta in mente era aggiungere un pannello vuoto se non ci sono dati. Questa non è una soluzione ideale perché ho ottenuto del codice non necessario nel codice Java e molti div vu nel mio html renderizzato.

Quindi c'è una soluzione migliore per includere diverse parti di un modello di wicket solo in condizioni?

risposta

4

Anche se questa è una vecchia questione qui potrebbe essere una soluzione in più: wicket:enclosure (e this)

Aggiornamento: Ora avevo bisogno di questa funzionalità con la mia auto (per jetwick). Sto usando WebMarkupContainer uno per lo stato loggedin e uno per lo stato loggedOut e impostare la giusta visibilità:

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

Il vantaggio di questo per me è che posso evitare un NullpointerExc nella // ## linea marcata e la racchiudono la caratteristica del wicket mi sembrerebbe più brutta in questo caso, penso.

+0

Grazie, questa sembra una buona soluzione! – theomega

+0

vedere la mia risposta aggiornata – Karussell

+0

@Karussell, c'è un 'new' mancante proprio sopra il' else'? – aioobe

1

Immagino che questo sia il motivo per cui c'è EmptyPanel. Senza conoscere il tuo codice in più posso solo dire che quello che penso che stai facendo è qualcosa che farei con la combinazione di alcuni figli di AbstractRepeater e Fragment. Se sei disposto a dire di più su quello che vuoi fare e magari fornire anche del codice, sarò felice di aiutarti il ​​più possibile.

0

è possibile chiamare setVisible (false); sul componente che si desidera nascondere.

3

Come ha detto @miaubiz, è possibile chiamare setVisible (false) oppure è possibile sovrascrivere il metodo isVisible(), se la visibilità è condizionale a un altro stato (campi riempiti, ad esempio).

2

Sì, si desidera eseguire l'override è Visibile. Ciò manterrà isVisible = false markup html dal rendering uniforme alla pagina html finale. Inoltre, in base alla documentazione (citata in EmptyPanel), è possibile utilizzare WebMarkupContainer come componente di wrapping.

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

Altro dalla documentazione wicket (https://cwiki.apache.org/WICKET/lifecycle-of-a-wicket-application.html): Component.render() segue questi passi per rendere un componente: 1. Determinare la visibilità del componente. Se il componente non è visibile, la Response di RequestCycle viene modificata in NullResponse.getInstance(), che è un'implementazione Response che semplicemente ignora l'output. – jgormley