renderHead не вызывается

#java #wicket

#java #калитка

Вопрос:

У меня есть класс, CloakDecorator который реализует IAjaxCallDecorator и IHeaderContributor :

 public class CloakDecorator implements IAjaxCallDecorator, IHeaderContributor {

    @SuppressWarnings("unused")
    private static final ResourceReference INDICATOR = new ResourceReference(CloakDecorator.class, "indicator.gif");
    private static final ResourceReference JS = new JavascriptResourceReference(CloakDecorator.class, "CloakDecorator.js");
    private static final ResourceReference CSS = new ResourceReference(CloakDecorator.class, "CloakDecorator.css");

    public CloakDecorator() {
        System.out.println("Constructor");
    }

    public void renderHead(final IHeaderResponse response) {
        System.out.println("renderHead");
        response.renderCSSReference(CSS);
        response.renderJavascriptReference(JS);
    }

    @Override
    public CharSequence decorateScript(CharSequence script) {
        return script;
    }

    @Override
    public CharSequence decorateOnSuccessScript(CharSequence script) {
        return script;
    }

    @Override
    public CharSequence decorateOnFailureScript(CharSequence script) {
        return script;
    }
}
  

Теперь из AjaxLink я создаю экземпляр CloakDecorator :

 AjaxLink link=new AjaxLink("") {

    @Override
    public void onClick(AjaxRequestTarget target) {

    }

    @Override
    protected IAjaxCallDecorator getAjaxCallDecorator() {
        return new CloakDecorator();
    }
};
  

Проблема в том, что вызывается конструктор CloakDecorator , но renderHead метод не вызывается. Что я делаю не так? Я поместил некоторые из них System.out.println в конструктор и в renderHead метод, System.out.println из конструктора работает, а второй — нет.

Ответ №1:

К сожалению, простая реализация IHeaderContributor не гарантирует, что вы действительно внесете свой вклад в заголовок страницы / компонента. Это работает только для экземпляров Component и IBehavior элементов, которые добавляются на страницу, и для самой страницы. В частности, из javadoc IHeaderContributor :

 An interface to be implemented by components or behaviors that wish to 
contribute to the header section of the page.
  

Конкретный код, который вызывает это, находится в Component#renderHead(HtmlHeaderContainer) . Он проверяет, реализуется ли он сам и любое из его поведений IHeaderContributor , а затем добавляет эти вклады.

Чтобы решить вашу проблему, вы можете либо:

  1. Есть ваша AjaxLink реализация IHeaderContributor
  2. Добавьте IBehavior в свой AjaxLink , который реализует IHeaderContributor

В зависимости от того, как часто вы будете использовать это, вариант # 1 может быть лучшим. Создайте «CloakedAjaxLink», который выполняет все, что вам нужно.

Ответ №2:

Начиная с Wicket 1.5, IAjaxCallDecorators также могут вносить свой вклад в заголовок, если они реализуют IComponentAwareHeaderContributor.

Комментарии:

1. Я использую wicket 1.3.6, возможно ли это там?

2. Вам следует серьезно подумать об обновлении, по крайней мере, до Wicket 1.4 — есть некоторые накладные расходы на миграцию, но это значительное улучшение. В любом случае, я не думаю, что вы получите эту возможность, как в Wicket 1.5 🙂

Ответ №3:

Я думаю, вам нужно добавить IHeaderContributor к компоненту, чтобы он действительно «вносил свой вклад» в документ. То, как вы его используете, означает, что вы используете только половину желаемой реализации. Я предлагаю вам разделить вашу реализацию или написать CloakLink, включающий этот код, который сможет вносить вклад в страницу, на которой он добавлен.