1

我在 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'

似乎标记继承不支持 MarkupContainer 中的 wicket:child 标签,因此会打乱层次结构。我也考虑过使用边框,但得到相同的结果。

我的问题当然是如何通过维护当前的层次结构来完成这项工作,因为控制(阅读:Java 对象)widgetBox 和widgetContent 很重要。

4

1 回答 1

2

这是关于您的问题的另一个问题: wicket:child 标签可以嵌套在页面上的另一个组件下吗?

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

但是,正如我发现的那样,请注意,如果您的子页面定义了s ,则 usingTransparentWebMarkupContainer将失败。wicket:fragment请参阅问题WICKET-4545WICKET-5440

于 2014-04-15T14:14:43.757 回答