Wicket中的装饰器组件

时间:2010-05-31 14:43:09

标签: listview wicket

是否可以在wicket中实现某种装饰器组件? 特别是在尊重装饰组件的id时?

目前我尝试使用Border Component充当装饰器来解决这个问题:

假设:

public XXXPage()
{
   MyBorder border = new MyBorder("xxx");
   border.add( new Label("xxx", "Foo") ); // label just as simplification. Its really a Component that we want to surround the anchor (linkify) around.
   add(border);
} 

XXXPage.html

<body>
<span wicket:id="xxx"/>
</body>

MyBorder.html

<wicket:border>
<a wicket:id="link"><wicket:body/></a>
</wicket:border>

MyBorder.java

public MyBorder(String id)
{
    super(id);
    AjaxLink link = new AjaxLink("link")
    {
       @Override public void onClick(AjaxRequestTarget arg0)
      {
      }
    };
add(link);
link.add(getBodyContainer()); // from javadoc of Wicket's Border
}

给出:

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. [Component id = xxx]
at org.apache.wicket.Page.checkRendering(Page.java:1182)

因此,实质上,xxx组件应该以透明的方式包含链接组件。这个xxx失控了。

在“香蕉检票口”实施中,这可能是一个伪代码:

Component wrapWithAction(Component a) {
// now wrap
    Link b = new Link() {
     // handle link onClick and all that
    }
    b.wrap(a);
    return b;
}
// 

3 个答案:

答案 0 :(得分:2)

取决于装饰师想要做什么样的东西。装饰的常规含义是让对象B承担对象A的角色,提供完全相同的合同,使用A来实现该合同,但在此之上做一些额外的事情。我认为这不是Widgets的常见情况。相反,您正在寻找重用某些部分(UI和状态,可能是行为)。一般来说,在我看来,这最适合使用面板和标记继承。

从技术上讲,边框是开箱即用的可重复使用的装饰解决方案,但实际上它们有点毛茸茸。对于做简单装饰的相对简单的方法,请参阅我在Generating commented-out content with Wicket上的答案(使用Wicket渲染管道工作的有些未记录的方式)。还表明Wicket的行为是一种非常灵活的方式来修改现有组件的行为,而不需要更改这些组件本身。除此之外,我只是明确地设计重用。

答案 1 :(得分:1)

我认为你在ListView中添加WebMarkupContainer或Fragment比其他任何东西都好运。这两个都可以包含其他组件,如链接,标签等。

如果您需要更多帮助,请告诉我。

答案 2 :(得分:0)

为“onclick”添加AjaxEventBehavior到组件。 Javadoc I链接中的示例可以满足您的需求。

你可以将行为添加到Wicket中的几乎任何东西,这是它最强大的功能之一。