如何在渲染页面后添加组件

时间:2015-05-14 12:35:33

标签: java wicket wicket-1.5

将wicket迁移到1.5后,我遇到了这个问题。 在Wicket 1.5中我(程序员在我之前)在构造函数中添加了JS和CSS引用,然后是组件,simmilar对此:

    public abstract class PageTemplate extends WebPage implements IHeaderContributor {
        public BarePageTemplate() {
            this(null);
        }

        public BarePageTemplate(PageParameters params) {
            super(params);
            add(JavascriptPackageResource.getHeaderContribution(ResourceMarker.class, "js/jquery-1.4.2.min.js"));
            add(JavascriptPackageResource.getHeaderContribution(ResourceMarker.class, "js/jquery-ui-1.8.4.custom.min.js"));
            [...]
            jGrowlMarker = new Label("jGrowlMarker"); // placeholder for jgrowl messages
            jGrowlMarker.setOutputMarkupId(true);
            jGrowlMarker.add(new JGrowlBehavior());
            add(jGrowlMarker);
        }
    }

在wicket 1.5中,这已不再可能。根据{{​​3}},我将此代码重构为:

     public abstract class PageTemplate extends WebPage implements IHeaderContributor {
        public BarePageTemplate() {
            this(null);
        }

    public BarePageTemplate(PageParameters params) {
        super(params);
        jGrowlMarker = new Label("jGrowlMarker"); // placeholder for jgrowl messages
        jGrowlMarker.setOutputMarkupId(true);
        jGrowlMarker.add(new JGrowlBehavior());
        add(jGrowlMarker);
    }

    @Override
    public void renderHead(IHeaderResponse response) {
        response.renderJavaScriptReference(new CommonResourceRef("js/jquery-1.4.2.min.js"));
        response.renderJavaScriptReference(new CommonResourceRef("js/jquery-ui-1.8.4.custom.min.js"));
[...]
}
}

这段代码有效,我的意思是它包括那些js。导致我出现问题的是,现在我的组件(在本例中为jGrowlMarker)在页面包含那些js之前在页面中呈现:

// jGrowl component

<script type="text/javascript" src="./wicket/resource/pl.softq.commons.ui.resource.ResourceMarker/js/jquery-1.4.2.min-ver-65B352E1BA79F0E2A3B1E014BC2571AF.js"></script>
<script type="text/javascript" src="./wicket/resource/pl.softq.commons.ui.resource.ResourceMarker/js/jquery-ui-1.8.4.custom.min-ver-88A9784D8E08D25998F239E2D65F03D7.js"></script>

因为它没有正常工作(我认为这是一个问题)。它尝试创建jGrowl组件,但在此组件之后添加jGrowl.js。 [...]象征着我的其余js和css refenreces(包括jGrowl)。我试图添加super.renderHead(response);到renderHead但它也不起作用(super.renderHead在Component.class中引用空的)。

所以我的问题是:如何在renderHead初始化后添加组件或如何在renderHead中添加组件。 我不是wicket的专家,所以如果您需要更多代码,请告诉我。

1 个答案:

答案 0 :(得分:2)

您可以将renderHead()方法移动到JGrowlBehavior。这样它首先会贡献依赖项,然后是jgrowl.js本身。 如果依赖关系是由页面中的其他内容提供的,那么Wicket将检测到这一点并仅提供一次。

在Wicket 6.x中,该领域还有进一步的改进。您可以阅读http://wicketinaction.com/2012/07/wicket-6-resource-management/