Wicket嵌套片段

时间:2012-05-29 12:56:04

标签: java wicket fragment

我正在尝试将一个片段嵌入另一个片段中。列表视图填充了父片段(可以工作),现在我想要一些第二个片段嵌套在第一个片段中的情况。这是我填充列表视图的代码:

@Override
protected void populateItem(final Item<Message> item) {
    Message msg = item.getModelObject();
    MessageFragment msgFragment = new MessageFragment("entry", "messageFragment", this, msg);
    WebMarkupContainer msgRatingContainer = new WebMarkupContainer("messageRatingContainer");
    msgRatingContainer.setVisible(false);
    if(msg.getType() == MessageType.RESERVATION){
        msgRatingContainer.add(new MessageRatingFragment("messageRatingContainer", "messageRatingFragment",this, msg));                 
        msgRatingContainer.setVisible(true);
    }
    msgFragment.add(msgRatingContainer);
    item.add(msgFragment);
}

涉及的标记:

<li wicket:id="listView"><div wicket:id="entry"></div></li>
<wicket:fragment wicket:id="messageFragment">
    <div class="MessageAlert">
        My Parent fragment content
    </div>
    <div  wicket:id="messageRatingContainer"></div>
    <wicket:fragment wicket:id="messageRatingFragment">
        My nested fragment content
    </wicket:fragment>
</wicket:fragment>

如果我没有任何嵌套片段(if条件为false),则按预期显示UI,如果条件为真,则会收到以下错误:

org.apache.wicket.WicketRuntimeException: The component(s) below failed to render. A common problem is that you have added a component in code but forgot to reference it in the markup (thus the component will never be rendered).
1. [MarkupContainer [Component id = messageRatingContainer]]
2. [MarkupContainer [Component id = messageRatingContainer]]

我认为是与组件层次结构相关的东西,但我找不到哪种方式是正确的。

1 个答案:

答案 0 :(得分:0)

问题似乎是,如果msg.getType() != MessageType.RESERVATION,您不会在ID messageRatingContainer下添加任何内容。

您应该始终添加它,然后使用true和false调用setVisible(),具体取决于您是否要渲染它。

顺便说一句,从上面的代码片段中我根本看不出需要使用片段。