每当我必须将一些组件(A)添加到另一个组件(B)的AjaxRequestTarget时(通常是同一父级的两个孩子,我面临同样的决定:
使用父get(path)方法创建父组件的成员变量。两种变体似乎都有利有弊,我无法从“更好”代码的角度来决定哪种变得更好......
即使(A)的路径发生变化,但第一个变体仍然是稳定的,但是父母的成员只是很少使用。另一个变体导致更清晰的父类,但在组件层次结构更改时添加了多个故障点。另外这个变体要么用魔术字符串(路径)或字符串常量(当我把路径放在那里时)来填充类......
任何提示都会被贬低。
编辑:这适用于Wicket 1.4,因为Wicket 1.5使用EventBus解决了这个问题
答案 0 :(得分:8)
使用Wicket 1.5的事件机制代替使用Ajax更新组件。这样您就可以将发布者和订阅者分离。例如,请参阅我在新features in Wicket 1.5 given at JavaZone'11上的演示文稿(跳至演讲约51分钟)。
取自Wicket 1.5发行说明:
Wicket 1.5为组件提供了一种简单而灵活的方式,可以以分离的方式相互通信。促成这一点的两个主要接口是:
/**
* Objects that can send events
*/
public interface IEventSource {
<T> void send(IEventSink sink, Broadcast broadcast, T payload);
}
和
/**
* Objects that can receive events
*/
public interface IEventSink
{
/**
* Called when an event is sent to this sink
*/
void onEvent(IEvent<?> event);
}
实现这些接口并因此可以参与事件机制的类包括:Component
,RequestCycle
,Session
和Application
。
该机制允许在此定义不同的事件广播方法:
/**
* Defines the event broadcast type.
*/
public enum Broadcast {
BREADTH,
DEPTH,
BUBBLE,
EXACT;
}
有example in wicket-examples证明了这一点的用法。
应用程序可以在FrameworkSettings中注册自定义事件调度程序;调度程序可用于构建自定义事件传递机制。例如,自定义IEventDispatcher机制可以将事件路由到带注释的方法,例如:
public class MyComponent extends Component {
@OnEvent
private void onUserAdded(UserAddedEvent event) {...}
}
其中UserAddedEvent
是事件有效负载对象。
即使注册了自定义调度程序,也会调用默认的Component#onEvent
方法。
每当Wicket开始创建AJAX响应时,都会引发默认事件。事件的有效负载是用于事件的AjaxRequestTarget。示例实施:
// component that always adds itself to the ajax response
public class MyComponent extends Component {
public void onEvent(IEvent event) {
if (event.getPayload() instanceof AjaxRequestTarget) {
((AjaxRequestTarget)event.getPayload()).add(this);
}
}
}
答案 1 :(得分:1)
我部分地将移植事件移植到Wicket 1.3以获取与1.4相关的ajax交互。它没有Wicket 1.5事件中的所有功能,也没有那么高效,但到目前为止它运行良好。您可能会发现解耦组件很有用。
作为并增加了奖励,这些事件可以在(1)模态窗口页面创建者(2)弹出窗口创建的页面中工作
这里发布的源代码太多了,但这里是示例项目+源代码的链接:
https://github.com/robmcguinness/wicket-events
源中的示例包括从以下方面进行通信的事件:(1)页面到面板(2)模态页面到页面打开器(3)弹出窗口到页面打开器