Я использую наследование разметки в Wicket 6.14.0 для создания простого виджет с заголовком и содержимым. Разметка родителя выглядит так:
<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:child внутри MarkupContainer и, следовательно, портит иерархию. Я также рассматривал возможность использования вместо этого Border, но получил тот же результат.
Мой вопрос, конечно, заключается в том, как получить эту работу, поддерживая текущую иерархию, поскольку важно иметь контроль (читай: объект Java) для widgetBox и widgetContent.