renderHead не вызывается - PullRequest
4 голосов
/ 27 мая 2011

У меня есть класс 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 работает, а второй нет.

Ответы [ 3 ]

2 голосов
/ 27 мая 2011

К сожалению, простая реализация 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», который делает все, что вам нужно.

1 голос
/ 28 мая 2011

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

0 голосов
/ 27 мая 2011

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

...