我有一个实现 CloakDecoratorIAjaxCallDecorator 的类 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 并不能保证您实际上会为页面/组件的标题做出贡献。这仅适用于添加到页面和页面本身的 ComponentIBehavior 元素的实例。具体来自 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”来满足您的所有需求。

    10-05 22:59