2009-08-06 12 views
8

Hy, Quiero mostrar una determinada parte (un div por ejemplo) de mi wicket-template solo bajo ciertas condiciones (por ejemplo, solo si tengo los datos para llenarlo). El problema es:Wicket: visualización condicional en la plantilla

Si solo agrego el panel (llenando el div) si obtuve los datos, se lanza una excepción cada vez que llamo a la página sin los datos (porque el wicket-id referenciado no se agrega al componente-árbol).

La única solución que me vino a la mente fue agregar un panel vacío si no hay datos. Esta no es una solución ideal porque obtuve un código innecesario en el código java y muchos divs vacíos en mi html renderizado.

¿Existe una solución mejor para incluir varias partes de una plantilla de wicket solo bajo una condición?

Respuesta

4

Aunque esta es una vieja cuestión aquí podría ser una solución más: wicket:enclosure (y this)

actualización: Ahora que necesitaba esta funcionalidad por mi mismo (por jetwick). Estoy usando WebMarkupContainer uno para el estado loggedin y uno para el estado loggedOut y establecer la visibilidad derecha:

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

La ventaja de esto para mí es que puedo evitar que un NullpointerExc en el ## // marcada línea y el enclose La característica de wicket sería más fea para mí en este caso, creo.

+0

¡Gracias, parece una buena solución! – theomega

+0

ver mi respuesta actualizada – Karussell

+0

@Karussell, ¿hay un 'nuevo' que falta justo arriba del' else'? – aioobe

1

Supongo que es por eso que hay EmptyPanel. Sin saber más sobre tu código, solo puedo decir que lo que creo que estás haciendo es algo que haría con la combinación de algún hijo de AbstractRepeater y Fragment. Si está dispuesto a contar más sobre lo que quiere hacer y quizás también a proporcionar algún código, con gusto lo ayudaré tanto como pueda.

0

puede llamar a setVisible (falso); en el componente que quieres ocultar

3

Como @miaubiz dijo, puede llamar a setVisible (falso), o puede anular el método isVisible(), si la visibilidad es condicional a algún otro estado (campos rellenos, por ejemplo).

2

Sí, quieres anular isVisible. Esto mantendrá isVisible = false html markup incluso de la representación en la página html final. Además, de acuerdo con los documentos (mencionados en EmptyPanel), puede usar WebMarkupContainer como componente de embalaje.

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

más de los docs wicket (https://cwiki.apache.org/WICKET/lifecycle-of-a-wicket-application.html): Component.render() sigue estos pasos para rendir un componente: 1. Determine la visibilidad del componente. Si el componente no está visible, la respuesta del RequestCycle se cambia a NullResponse.getInstance(), , que es una implementación de respuesta que simplemente descarta su resultado. – jgormley