在Wicket 1.4中,我试图允许子页面改变父页面中标记的CSS类,我一直这样做。这种情况的奇怪之处在于,我想要定位的标签包装子页面标记。这是我尝试的简化片段:
ParentPage.html
<div id="main" wicket:id="main">
<wicket:child />
</div>
ParentPage.java
public abstract class ParentPage {
private WebMarkupContainer main;
protected ParentPage() {
main = new WebMarkupContainer("main");
add(main);
}
public void setClassAttr(String cssClass){
main.add(SimpleAttributeModifier("class", cssClass);
}
}
ChildPage.html
<wicket:extend>
...
</wicket:extend>
ChildPage.java
public class ChildPage extends Page {
...
public ChildPage() {
super();
...
setClassAttr("specific-class-for-this-page");
}
}
...因为看起来 child 中的HTML加载了,而不是java,所以会爆炸。 (如果我删除了div#main
上的wicket:id和java代码,一切都很好。)
请注意, parent 上我想要从子操作的标记实际上是包裹wicket:child
标记。在其他情况下,我做了类似的事情,我想要与之相关的标签往往是兄弟姐妹,或者与wicket:child
标签相距甚远。
我真正想做的就是让孩子改变父母的class属性 - 还有另外一种方法吗?为什么子页面不能嵌套在另一个Wicket页面组件下?
答案 0 :(得分:7)
我想指出,从Wicket 1.5开始,这已被删除。因此,如果您使用的是Wicket 1.5或更高版本,则可以使用TransparentWebMarkupContainer
组件而不是WebMarkupContainer.isTansparentResolver()
。我也遇到了和海报一样的问题。我有一个外部的包含div,包含一个wicket:child标签,我根据需要显示的内容调整其宽度(Twitter Bootstrap流体网格)。我的mainContentContainer
是TransparentWebMarkupContainer
:
<div class="row-fluid">
<div class="span3" wicket:id="sidebarPanel"></div>
<div class="span6" wicket:id="mainContentContainer">
<wicket:child/>
</div>
<div class="span3" wicket:id="rightPanel"></div>
</div>
有时rightPanel
完全隐藏,mainContentContainer
更改为class="span9"
以占用未使用的视口。
感谢发帖。在我阅读这篇文章之前,我遇到了完全相同的问题。
答案 1 :(得分:3)
首先,它与实际设置属性无关,而是将<wicket:child>
放在容器中。
现在想象一下,如果ChildPage
是Panel
,那么ParentPage
的代码会是什么样子?它会包含一行main.add( new ChildPanel() )
。这就是main
组件在呈现时知道它应该如何调用子面板的呈现方法。
但是继承会有所不同。您的main
组件无法知道<wicket:child>
应解决的问题。将main
容器标记为透明告诉Wicket要求父组件(即您的页面组件)解析并呈现它。
答案 2 :(得分:1)
它运作良好。在wicket上的组件:id =“main”做上面的事情。
ain = new WebMarkupContainer("main") {
private static final long serialVersionUID = 1L;
@Override
public boolean isTransparentResolver() {
return true;
}
};
并且不会发生异常。
答案 3 :(得分:1)
我认为您的子页面扩展了父页面。为什么不将类名传递给父的构造函数,如
public class ChildPage extends ParentPage {
public ChildPage() {
super("my-class");
}
}
答案 4 :(得分:0)
一位同事找到了修复程序 - 将组件放在检票口上:子标记为“transparentResolver”。任何能够清楚地表达出如何正常工作的人都能获得+1吗?
main = new WebMarkupContainer("main") {
private static final long serialVersionUID = 1L;
@Override
public boolean isTransparentResolver() {
return true;
}
};
add(main);
答案 5 :(得分:0)
我认为,你的检票口使用(或至少你发布的代码)很奇怪(我试过1.4.22)...
public abstract class ParentPage {
可能你忘了extends WebPage
。
public class ChildPage extends Page {
这里你想扩展ParentPage
我想。
一切都按预期工作,最终生成的HTML是
<div id="main" wicket:id="main" class="specific-class-for-this-page">
<wicket:child>
<wicket:extend>
text
</wicket:extend>
</wicket:child>
</div>
我的建议是&#34;当你不需要&#34;时,不要将HTML id用于wicket元素。