2010-10-14 17 views
7

Por razones de depuración, y por un capricho, me gustaría incluir cierta información en la salida HTML de una página Wicket que es incluida en los comentarios HTML.Generar contenido comentado con Wicket

La salida sería algo así como ...

<!-- 
<div wicket:id="foo"> 1234 </div> 
--> 

... donde "1234" es alguna pieza interesante, creado de forma dinámica de la información.

he intentado, sin éxito:

  • <!-- <div wicket:id="foo"></div> --> → Wicket se queja de que el elemento con id "foo" no se encuentra en la página HTML
  • encierran en <wicket:remove> → dichas secciones no pueden contener elementos con wicket:id
  • label.setVisible(false) → Wicket no da salida a la etiqueta en absoluto
  • new Label("foo", "<!-- " + foo + " -->") → el < y > get escapó

Entonces, ¿puedes hacer esto con Wicket (fácilmente), o debería olvidarlo?

Respuesta

15

¿Qué tal esto?

class CommentOutModifier extends AbstractBehavior { 
    private static final long serialVersionUID = 1L; 

    @Override 
    public void beforeRender(Component component) { 
     component.getResponse().write("<!--"); 
    } 

    @Override 
    public void onRendered(Component component) { 
     component.getResponse().write("-->"); 
    } 
} 

add(new Label("tohide", "Hi, can you see me?").add(new CommentOutModifier())); 

a continuación, poner:

<span wicket:id="tohide"></span> 

en su margen de beneficio rendirá:

<!--<span>Hi, can you see me?</span>--> 
+1

Y lo bueno de esa solución es que puede aplicarla a cualquier componente sin cambiar el componente en sí. – Eelco

+0

Gracias! Esto se ve muy elegante. – Jonik

+0

Si esto funciona como sospecho, entonces es una solución bastante elegante, cudos :) Estoy revisando mi respuesta para implementar este método en aras de la exhaustividad, pero creo que Eelco merece obtener la respuesta para esto. – BjornS

2
Label l = new Label("foo", "<!-- " + foo + " -->"); 
l.setEscapeModelStrings(false); 

No es bonito, pero es rápido y fácil. También creo que hay una configuración de wicket específica (en algún lugar de la aplicación) que puedes activar para evitar que se eliminen los comentarios, pero sinceramente no recuerdo dónde la vi.

Editar: Agregado comentario trabajador

Edit2: Implementado el comportamiento de Eelco para la integridad. Es mejor que mi enfoque de todos modos.

public enum Comment { 
; 
    /** 
    * creates a wicket comment (extends label 
    */ 
    public static Label newComment(String id, String comment) { 
     Label label = new Label(id, comment); 
     label.add(commentBehaviour()); 
     return label; 
    } 

    /** 
    * Adds &lt;!-- and --&gt around the component. 
    */ 
    public static AbstractBehavior commentBehaviour() { 
     return new AbstractBehavior() { 
      private static final long serialVersionUID = 1L; 

      @Override 
      public void beforeRender(Component component) { 
       component.getResponse().write("<!--"); 
      } 

      @Override 
      public void onRendered(Component component) { 
       component.getResponse().write("--!>"); 
      } 
     }; 
    } 
} 

add(Comment.newComment("comment","Something worth commenting upon")); 
+0

Gracias; esto funciona bien para mi necesidad actual. (Y puede hacerse un poco más limpio con 'String.format()'.) Lo aceptaré después de un tiempo, a menos que surja algo obviamente mejor. – Jonik

+0

@Jonik Creo que esta es * la * forma de hacerlo, así que no contenga la respiración :) – jensgram

+0

Me inspiró para hacer esto: public enum Comentario { \t; \t public static Etiqueta newComment (String id, String comment) { \t \t Label label = new Etiqueta (id, String.format ("<-- %s -->", comentario)); \t \t label.setEscapeModelStrings (false); \t \t etiqueta de devolución; \t} } add (Comment.newComment ("comentario", "la barra foo va aquí")); – BjornS

1

jugado un poco y llegamos a este:

Label label = new Label("commented", "Content") { 
    @Override 
    protected void onComponentTag(ComponentTag tag) { 
     tag.setName("!--"); 
     super.onComponentTag(tag); 
    } 
}; 
add(label); 

Pero no es bastante ..: <span wicket:id="commented">This will be replaced</span>
se convierte en: <!-- wicket:id="commented">Content</!-->

Pero al menos que no interfiera con la disposición/CSS estilos.

+0

+1, hack interesante. :) Lo bueno de esto es que puedes crear un componente personalizado (CommentaLabel extends Label) que anula onComponentTag(), y después de eso usar esto en las páginas es muy limpio. – Jonik

+0

... que por supuesto puedes hacer eso con la solución de Bjorn también, así que no hay gran diferencia allí. Supongo que es una cuestión de gusto cuál de estos es menos "no bonito". :) – Jonik

+1

¿Wicket convierte la etiqueta de cierre? ¿O quiso decir ' Contenido'? (Tenga en cuenta el '!' - no es que importe.) – jensgram