我在Wicket 6.14.0中使用markup inheritance来创建一个包含标题和内容的简单小部件。父母的标记如下所示:
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:wicket>
<wicket:panel>
<div wicket:id="widgetBox">
<div wicket:id="widgetTitle"><wicket:enclosure child="icon"><span class="icon"><i wicket:id="icon"></i></span></wicket:enclosure>
<h5 wicket:id="headline"></h5>
</div>
<div wicket:id="widgetContent"><wicket:child/></div>
</div>
</wicket:panel>
</html>
它的代码很简单,但为了完整起见:
public class ParentPanel extends Panel {
public ParentPanel(final String id, final IModel<String> title) {
super(id, title);
WebMarkupContainer widgetBox = new WebMarkupContainer("widgetBox");
add(widgetBox);
final WebMarkupContainer widgetTitle = new WebMarkupContainer("widgetTitle");
widgetBox.add(widgetTitle);
final WebMarkupContainer icon = new WebMarkupContainer("icon");
if (titleIcon != null) {
// custom class
icon.add(new IconBehavior("titleIcon"));
} else {
icon.setVisible(false);
}
widgetTitle.add(icon);
widgetTitle.add(new Label("headline", title));
widgetContent = new WebMarkupContainer("widgetContent");
widgetContent.add(new WidgetContentBehavior());
widgetBox.add(widgetContent);
}
}
现在为子组件。这是最简单的标记:
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:wicket>
<wicket:extend>
<span wicket:id="foobar"></span>
</wicket:extend>
</html>
当然还有Java代码:
public class ChildPanel extends ParentPanel {
public ChildPanel(final String id, final IModel<String> title) {
super(id, title);
add(new Label("foobar", "Foobar"));
}
}
我当然期待的是一个呈现的页面,上面写着“Foobar”,其中放置了wicket:child标签。相反,这是RuntimeException:
Last cause: Unable to find component with id 'foobar' in [TransparentWebMarkupContainer [Component id = wicket_extend3]]
Expected: 'foobar:widgetBox:widgetContent:wicket_child2:wicket_extend3:foobar'.
Found with similar names: 'foobar', foobar:foobar'
似乎标记继承不支持wicket:MarkupContainer中的子标记因此会混淆层次结构。我也考虑使用Border来获得相同的结果。
我当然的问题是如何通过维护当前的层次结构来完成这项工作,因为对widgetBox和widgetContent进行控制(读取:Java对象)非常重要。
答案 0 :(得分:2)
以下是关于您的问题的另一个问题: Can a wicket:child tag be nested under another Component on the Page?
提供的答案使用TransparentWebMarkupContainer
来解决问题。
然而,正如我发现的那样,请注意,如果您的子页面定义TransparentWebMarkupContainer
,则使用wicket:fragment
将失败。查看问题WICKET-4545和WICKET-5440