Wicket标记继承不适用于wicket:MarkupContainers中的子标记

时间:2014-04-11 14:35:22

标签: java wicket wicket-6

我在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对象)非常重要。

1 个答案:

答案 0 :(得分:2)

以下是关于您的问题的另一个问题: Can a wicket:child tag be nested under another Component on the Page?

提供的答案使用TransparentWebMarkupContainer来解决问题。

然而,正如我发现的那样,请注意,如果您的子页面定义TransparentWebMarkupContainer,则使用wicket:fragment将失败。查看问题WICKET-4545WICKET-5440