Wicket: visualizzazione condizionale in Template
Domanda
Hy, Voglio visualizzare una certa parte (un div per esempio) della mia wicket-template solo in una determinata condizione (per esempio solo se ho i dati per riempirlo). Il problema è:
Se solo aggiungo il pannello (riempire il div) se ho ottenuto i dati, viene generata un'eccezione ogni volta che io chiamo la pagina senza i dati (in quanto il riferimento wicket-id non viene aggiunto al componente-albero).
L'unica soluzione che mi è venuta in mente è stato quello di aggiungere un pannello vuoto se non ci sono dati. Questa non è una soluzione ideale perché ho ottenuto un certo codice non necessario nel codice Java e molti div vuoti nel mio html renderizzato.
Quindi non v'è una soluzione migliore per includere varie parti di un wicket-modello solo in una condizione?
Soluzione
Anche se questa è una vecchia questione qui potrebbe essere una soluzione in più: wicket: recinto (e questo )
Aggiorna : Ora ho 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 caratteristica di allegare wicket guarderei più brutto per me in questo caso credo.
Altri suggerimenti
Come @miaubiz detto, è possibile chiamare setVisible (false), oppure si può sovrascrivere il metodo IsVisible (), se la visibilità è subordinata a qualche altro stato (campi pieni, per esempio).
Yup, si desidera ignorare IsVisible. Ciò manterrà il IsVisible = false markup HTML anche il rendering alla pagina finale html. Inoltre, secondo la documentazione (menzionato in EmptyPanel ), è possibile utilizzare il WebMarkupContainer come componente di avvolgimento.
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(); }
};
Credo che questo è il motivo per cui c'è EmptyPanel . Senza conoscere il codice più Posso solo dire che quello che penso che stai facendo è qualcosa che mi piacerebbe fare con la combinazione di qualche bambino di AbstractRepeater e frammento . Se siete disposti a dire di più su ciò che si vuole fare e forse fornire qualche codice di troppo, sarò felice di aiutare il più possibile.
è possibile chiamare setVisible (false); sul componente che si desidera nascondere.