wicket:AjaxLazyLoadPanel中的片段

时间:2013-01-15 14:20:27

标签: java web wicket

我想在延迟加载的页面上渲染一些wicket片段。 Java示例如下:

staticPanel.add(new AjaxLazyLoadPanel("fragment4Span") {

        @Override
        public Component getLazyLoadComponent(String id) {
            fragment4 = new Fragment4(id, "fragment4", this);
            fragment4.add(propertyLoop4);
            return fragment4;
        }
    });

和html组件:​​

<span wicket:id="fragment4Span"></span>
<wicket:fragment wicket:id="fragment4">
</wicket:fragment>

但我得到以下例外:

org.apache.wicket.markup.MarkupException: Markup of component class `org.apache.wicket.extensions.ajax.markup.html.AjaxLazyLoadPanel` does not contain a fragment with wicket:id `fragment4`. Context: [MarkupContainer [Component id = content]]
at org.apache.wicket.markup.html.panel.Fragment.renderFragment(Fragment.java:262)
at org.apache.wicket.markup.html.panel.Fragment.onComponentTagBody(Fragment.java:212)
at org.apache.wicket.Component.renderComponent(Component.java:2680)
at org.apache.wicket.MarkupContainer.onRender(MarkupContainer.java:1538)

可能是什么原因?顺便说一句,我无法通过Google搜索找到答案。

2 个答案:

答案 0 :(得分:1)

this - 它引用AjaxLazyLoadPanel实例 - 作为片段容器传递。但是,正如错误消息所述,它不包含片段。这是真的,因为您的页面/面板确实如此。

所以你实际上需要将对页面/面板的引用传递给Fragment构造函数:

fragment4 = new Fragment4(id, "fragment4", CurrentPageOrPanelName.this);

另一种可能性(不完全确定这是否有效)是改变你的标记,以便片段在ALLP中:

<span wicket:id="fragment4Span">
  <wicket:fragment wicket:id="fragment4">
  </wicket:fragment>
</span>

答案 1 :(得分:0)

您的标记中没有任何内容可以将片段添加到...即没有可能与您的id变量匹配的ID的组件。 你有片段4Span,它将是你的LazyLoadPanel,你有一个Fragment片段id“fragment4”但是没有匹配的“receiver”......

请参阅:The Wicket Examples about Fragments