2010-10-14 35 views
7

Dla celów debugowania i na zasadzie kaprysu, chciałbym dołączyć pewne informacje do wyjścia HTML strony Wicket, które jest zawarte w komentarzach HTML.Generowanie zakomentowanych treści za pomocą Wicket

Wyjście byłoby coś ...

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

... gdzie "1234" jest kilka ciekawych, dynamicznie utworzony fragment informacji.

próbowałem, bezskutecznie:

  • <!-- <div wicket:id="foo"></div> --> → Wicket zarzuca elementu o identyfikatorze „foo” brakuje ze strony HTML
  • ująć w <wicket:remove> → takie sekcje nie mogą zawierać elementy z wicket:id
  • label.setVisible(false) → Wicket nie emituje etykieta wcale
  • new Label("foo", "<!-- " + foo + " -->") → get < i > uciekł

Czy możesz to zrobić za pomocą Wicket (łatwo), czy powinienem o tym zapomnieć?

Odpowiedz

15

Co powiesz na to?

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

wtedy, stawiając:

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

w znacznikach przyniesie:

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

A miłą rzeczą w tym rozwiązaniu jest to, że można go zastosować do dowolnego komponentu bez zmiany samego komponentu. – Eelco

+0

Dzięki! To wygląda całkiem elegancko. – Jonik

+0

Jeśli to działa tak, jak podejrzewam, to jest to dość eleganckie rozwiązanie, cudo :) Wracam do mojej odpowiedzi, aby wdrożyć tę metodę ze względu na kompletność, ale myślę, że Eelco zasługuje na odpowiedź. – BjornS

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

To nie jest ładne, ale jest szybkie i łatwe. Uważam też, że istnieje określone ustawienie furtki (gdzieś w aplikacji), które można włączyć, aby zapobiec znoszeniu komentarzy, ale szczerze mówiąc nie pamiętam, gdzie go widziałem.

Edit: Dodany komentarz pracownik

Edit2: Zaimplementowane zachowanie Eelco dla kompletności. To lepsze niż moje podejście.

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

Dzięki; to działa dobrze dla mojej obecnej potrzeby. (I może być trochę czystszy dzięki 'String.format()'.) Przyjmę to po pewnym czasie, chyba że pojawi się coś lepszego. – Jonik

+0

@Jonik Myślę, że to * sposób * zrobienia tego, więc nie wstrzymuj oddechu :) – jensgram

+0

Zainspirowałeś mnie, aby to zrobić: publiczna enum Komentarz { \t; \t Publiczna etykieta statyczna newComment (id łańcucha, komentarz do łańcucha) { \t \t Etykieta etykiety = nowa etykieta (id, String.format ("<-- %s -->", komentarz)); \t \t label.setEscapeModelStrings (fałsz); \t \t etykieta zwrotna; \t} } add (Comment.newComment ("komentarz", "pasek foo idzie tutaj")); – BjornS

1

bawił się trochę i mam do tego:

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

Ale to nie całkiem ..: <span wicket:id="commented">This will be replaced</span>
staje: <!-- wicket:id="commented">Content</!-->

Ale przynajmniej nie będzie kolidować z układem/style css.

+0

+1, interesujący hack. :) Dobrą rzeczą jest to, że można utworzyć niestandardowy komponent (CommentedLabel rozszerza Label), który przesłania onComponentTag(), a następnie używając tego na stronach jest bardzo czysty. – Jonik

+0

... co oczywiście możesz zrobić z rozwiązaniem Bjorna, więc nie ma w tym żadnej dużej różnicy. Sądzę, że to kwestia gustu, która z nich jest mniej "nie ładna". :) – Jonik

+1

Czy Wicket dokonuje konwersji tagu zamykającego? Czy miałeś na myśli ' Content'? (Zwróć uwagę na '!' - nie to ma znaczenia.) – jensgram

Powiązane problemy