我有一个实现 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
正在工作,但第二个没有。 最佳答案
遗憾的是,简单地实现 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 可能是最好的。创建一个“CloakedAjaxLink”来满足您的所有需求。