2010-10-14 14 views
7

Per motivi di debug, e per un capriccio, vorrei includere alcune informazioni nell'output HTML di una pagina di Wicket che è incluso nei commenti HTML.Generazione di contenuto commentato con Wicket

L'uscita sarebbe qualcosa di simile ...

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

... dove "1234" è un po 'interessante, pezzo creato in modo dinamico di informazioni.

ho cercato, inutilmente:

  • <!-- <div wicket:id="foo"></div> --> → Wicket lamenta che elemento con ID "pippo" manca dalla pagina HTML
  • racchiudere in <wicket:remove> → tali sezioni non possono contenere elementi con wicket:id
  • label.setVisible(false) → Wicket non uscita l'etichetta a tutti
  • new Label("foo", "<!-- " + foo + " -->") → get < e > sfuggito

Quindi, puoi farlo con Wicket (facilmente), o dovrei semplicemente dimenticarlo?

risposta

15

Che ne dici di questo?

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

poi, mettendo:

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

nel markup sarà resa:

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

E la cosa bella di questa soluzione è che puoi applicarlo a qualsiasi componente senza modificare il componente stesso. – Eelco

+0

Grazie! Questo sembra abbastanza elegante. – Jonik

+0

Se questo funziona come sospetto, allora la sua soluzione piuttosto elegante, cudos :) Sto rivedendo la mia risposta per implementare questo metodo per completezza ma penso che Eelco meriti di ottenere la risposta per questo. – BjornS

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

Non è bello ma è semplice e veloce. Credo anche che ci sia una specifica impostazione di wicket (da qualche parte nell'applicazione) su cui è possibile attivare per evitare di strappare i commenti, ma onestamente non riesco a ricordare dove l'ho vista.

Edit: Aggiunto commento lavoratore

Edit2: Implementato il comportamento di Eelco per completezza. È meglio del mio approccio comunque.

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

Grazie; questo funziona bene per il mio attuale bisogno. (E può essere reso un po 'più pulito con 'String.format()'.) Lo accetterò dopo un po', a meno che qualcosa di evidentemente migliore venga fuori. – Jonik

+0

@Jonik Penso che questo sia * il * modo di farlo in modo da non trattenere il respiro :) – jensgram

+0

Mi hai ispirato a farlo: public enum Scrivi un commento { \t; \t etichetta statica pubblica newComment (stringa id, stringa commento) { \t \t Etichetta etichetta = nuova etichetta (id, String.format ("<-- %s -->", commento)); \t \t label.setEscapeModelStrings (false); \t \t etichetta di reso; \t} } aggiungi (Comment.newComment ("commento", "foo bar va qui")); – BjornS

1

suonato in giro un po 'e arrivati ​​a questo:

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

Ma non è abbastanza ..: <span wicket:id="commented">This will be replaced</span>
diventa: <!-- wicket:id="commented">Content</!-->

Ma almeno non interferirà con il layout/stili CSS.

+0

+1, hack interessante. :) La cosa buona è che è possibile creare un componente personalizzato (CommentedLabel extends Label) che sovrascrive onComponentTag(), e dopo averlo utilizzato su pagine è molto pulito. – Jonik

+0

... che ovviamente puoi farlo anche con la soluzione di Bjorn, quindi non c'è grande differenza. Immagino sia una questione di gusti che di questi è meno "non carina". :) – Jonik

+1

Wicket converte il tag di chiusura? O intendevi " Contenuto'? (Si noti che '!' - non che importi.) – jensgram

Problemi correlati