私は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"));
}
}
私が期待しているのは、もちろん wicket:child タグが配置された「Foobar」というレンダリングされたページです。代わりに、次の 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'
マークアップの継承が MarkupContainer 内の wicket:child タグをサポートしていないため、階層が台無しになっているようです。代わりにBorderを使用することも検討しましたが、同じ結果が得られました。
私の質問はもちろん、widgetBox と widgetContent の制御 (Java オブジェクト) を持つことが重要であるため、現在の階層を維持することによってこの作業を行う方法です。