我有一个实施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
正在工作,但第二个没有。
答案 0 :(得分:2)
遗憾的是,仅仅实现IHeaderContributor
并不能保证您实际上会对页面/组件的标题做出贡献。这仅适用于添加到页面和页面本身的Component
和IBehavior
元素的实例。特别是来自IHeaderContributor
的javadoc:
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}}
醇>
根据您使用此频率的频率,选项#1可能是最佳选择。创建一个“CloakedAjaxLink”,它可以满足您的所有需求。
答案 1 :(得分:1)
由于Wicket 1.5 IAjaxCallDecorators如果实现了IComponentAwareHeaderContributor,也可以为标题做出贡献。
答案 2 :(得分:0)
我认为您需要将IHeaderContributor添加到组件中,以使其实际“贡献”到文档。你使用它的方式只使用了你想要的一半实现。我建议你拆分你的实现或编写一个包含这段代码的CloakLink,它可以为添加它的页面做出贡献。