是否可以在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;
}
//
答案 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中的几乎任何东西,这是它最强大的功能之一。