Nic*_*tar 2 wicket coding-style
每当我必须将一些组件(A)添加到另一个组件(B)的AjaxRequestTarget时(通常是同一父级的两个子组件,我面临同样的决定:
使用父get(路径)方法,使A成为父组件的成员变量.两种变体似乎都有利有弊,我无法从"更好"代码的角度来决定哪种变得更好......
第一个变体是稳定的,即使(A)的路径发生变化,但是父母仍然很少使用很少使用的成员.另一个变体导致更清晰的父类,但在组件层次结构更改时添加了多个故障点.另外这个变体要么用魔术字符串(路径)或字符串常量(当我把路径放在那里时)来填充类...
任何提示都会被贬低.
编辑:这适用于Wicket 1.4,因为Wicket 1.5通过其EventBus解决了这个问题
使用Wicket 1.5的事件机制代替使用Ajax更新组件.这样您就可以将发布者和订阅者分离.例如,请参阅我在JavaZone'11上给出的关于Wicket 1.5中新功能的演示文稿(跳到谈话的大约51分钟).
取自Wicket 1.5发行说明:
Wicket 1.5提供了一种简单而灵活的方式,使组件能够以分离的方式相互通信.促成这一点的两个主要接口是:
/**
* Objects that can send events
*/
public interface IEventSource {
<T> void send(IEventSink sink, Broadcast broadcast, T payload);
}
Run Code Online (Sandbox Code Playgroud)
和
/**
* Objects that can receive events
*/
public interface IEventSink
{
/**
* Called when an event is sent to this sink
*/
void onEvent(IEvent<?> event);
}
Run Code Online (Sandbox Code Playgroud)
实现这些接口,从而可以参加活动机理的类别是:Component,RequestCycle,Session,和Application.
该机制允许在此定义不同的事件广播方法:
/**
* Defines the event broadcast type.
*/
public enum Broadcast {
BREADTH,
DEPTH,
BUBBLE,
EXACT;
}
Run Code Online (Sandbox Code Playgroud)
应用程序可以在FrameworkSettings中注册自定义事件调度程序; 调度程序可用于构建自定义事件传递机制.例如,自定义IEventDispatcher机制可以将事件路由到带注释的方法,例如:
public class MyComponent extends Component {
@OnEvent
private void onUserAdded(UserAddedEvent event) {...}
}
Run Code Online (Sandbox Code Playgroud)
where 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);
}
}
}
Run Code Online (Sandbox Code Playgroud)