如何在渲染页面后添加组件
How to add component AFTER rendering page
将 wicket 迁移到 1.5 后,我遇到了这个问题。
在 Wicket 1.5 中,我(我之前的程序员)在构造函数和组件中添加 JS 和 CSS 引用,类似于此:
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 中,这不再可能。根据 migration guide 我将这段代码重构为:
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 方面的专家,所以如果您需要更多代码,请告诉我。
您可以将 renderHead() 方法移至 JGrowlBehavior。这样它将首先贡献依赖项,然后 jgrowl.js 本身。
如果依赖项也由页面中的其他内容贡献,Wicket 将检测到这一点并只贡献一次。
Wicket 6.x 在这方面有进一步的改进。您可以阅读 http://wicketinaction.com/2012/07/wicket-6-resource-management/
将 wicket 迁移到 1.5 后,我遇到了这个问题。 在 Wicket 1.5 中,我(我之前的程序员)在构造函数和组件中添加 JS 和 CSS 引用,类似于此:
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 中,这不再可能。根据 migration guide 我将这段代码重构为:
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 方面的专家,所以如果您需要更多代码,请告诉我。
您可以将 renderHead() 方法移至 JGrowlBehavior。这样它将首先贡献依赖项,然后 jgrowl.js 本身。 如果依赖项也由页面中的其他内容贡献,Wicket 将检测到这一点并只贡献一次。
Wicket 6.x 在这方面有进一步的改进。您可以阅读 http://wicketinaction.com/2012/07/wicket-6-resource-management/