不调用renderHead

时间:2011-05-27 13:11:55

标签: java wicket

我有一个实施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正在工作,但第二个没有。

3 个答案:

答案 0 :(得分:2)

遗憾的是,仅仅实现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,然后添加这些贡献。

要解决您的问题,您可以:

  1. 让您AjaxLink实施IHeaderContributor
  2. IBehavior实施AjaxLink
  3. IHeaderContributor添加{{1}}

    根据您使用此频率的频率,选项#1可能是最佳选择。创建一个“CloakedAjaxLink”,它可以满足您的所有需求。

答案 1 :(得分:1)

由于Wicket 1.5 IAjaxCallDecorators如果实现了IComponentAwareHeaderContributor,也可以为标题做出贡献。

答案 2 :(得分:0)

我认为您需要将IHeaderContributor添加到组件中,以使其实际“贡献”到文档。你使用它的方式只使用了你想要的一半实现。我建议你拆分你的实现或编写一个包含这段代码的CloakLink,它可以为添加它的页面做出贡献。