#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
, а затем добавляет эти вклады.
Чтобы решить вашу проблему, вы можете либо:
- Есть ваша
AjaxLink
реализацияIHeaderContributor
- Добавьте
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, включающий этот код, который сможет вносить вклад в страницу, на которой он добавлен.