2010-10-14 2 views
7

Для причин отладки и по прихоти я хотел бы включить определенную информацию в HTML-вывод страницы Wicket, который является , прилагаемый в комментариях HTML.Создание прокомментированного содержимого с помощью Wicket

Выходной сигнал будет что-то вроде ...

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

... где "1234" некоторые интересные, динамически создаваемые часть информации.

Я попытался, но безрезультатно:

  • <!-- <div wicket:id="foo"></div> --> → калиткой сетует, что элемент с идентификатором «Foo» отсутствует в HTML-страницы
  • Вложить в <wicket:remove> → такие участки не могут содержать элементы с wicket:id
  • label.setVisible(false) → калиткой не выводит этикетки на всех
  • new Label("foo", "<!-- " + foo + " -->") → в < и > ГЭТ избежали

Итак, можете ли вы сделать это с помощью Wicket (легко), или я должен просто забыть об этом?

ответ

15

Как насчет этого?

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

затем, положив:

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

в разметке даст:

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

И приятная вещь в этом решении заключается в том, что вы можете применить ее к любому компоненту без изменения самого компонента. – Eelco

+0

Спасибо! Это выглядит довольно элегантно. – Jonik

+0

Если это работает, как я подозреваю, тогда это довольно элегантное решение, cudos :) Я пересматриваю свой ответ, чтобы реализовать этот метод ради полноты, но я думаю, что Eelco заслуживает ответа на этот вопрос. – BjornS

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

Его не очень, но это быстро и просто. Я также считаю, что есть определенная настройка калитки (где-то в приложении), которую вы можете включить, чтобы предотвратить ее снятие комментариев, но я, честно говоря, не могу вспомнить, где я ее видел.

Edit: Добавлен комментарий рабочего

Edit2: Реализовано поведение Eelco для полноты картины. Это лучше, чем мой подход.

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

Спасибо; это работает нормально для моих текущих потребностей. (И может быть сделано немного чище с помощью 'String.format()'.) Я соглашусь это через некоторое время, если только что-то явно не улучшится. – Jonik

+0

@Jonik Я думаю, что это * * способ сделать это, так что не задерживайте дыхание :) – jensgram

+0

Вы вдохновили меня сделать это: public enum Комментарий { \t; \t public static Label newComment (String id, String comment) { \t \t Метка метки = новая метка (id, String.format («<-- %s -->», комментарий)); \t \t label.setEscapeModelStrings (false); \t \t метка возврата; \t} } add (Comment.newComment («комментарий», «foo bar идет здесь»)); – BjornS

1

игры вокруг немного, и получил на это:

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

Но это не очень ..: <span wicket:id="commented">This will be replaced</span>
становится: <!-- wicket:id="commented">Content</!-->

Но по крайней мере, не будет мешать макете/css.

+0

+1, интересный взлом. :) Хорошо, что вы можете создать настраиваемый компонент (CommentedLabel расширяет ярлык), который переопределяет onComponentTag(), и после этого использование этого на страницах очень чистое. – Jonik

+0

... что, конечно же, вы можете сделать это и с решением Бьорна, так что никакой большой разницы нет. Я думаю, это вопрос вкуса, который из них менее «некрасивый». :) – Jonik

+1

Преобразует ли Wicket закрывающий тег? Или вы имели в виду ' Content'? (Обратите внимание на '!' - не это важно.) – jensgram

Смежные вопросы