风格问题 - 成员变量与获取(路径)

时间:2011-12-09 12:07:28

标签: coding-style wicket

每当我必须将一些组件(A)添加到另一个组件(B)的AjaxRequestTarget时(通常是同一父级的两个孩子,我面临同样的决定:

使用父get(path)方法创建父组件的成员变量。两种变体似乎都有利有弊,我无法从“更好”代码的角度来决定哪种变得更好......

即使(A)的路径发生变化,但第一个变体仍然是稳定的,但是父母的成员只是很少使用。另一个变体导致更清晰的父类,但在组件层次结构更改时添加了多个故障点。另外这个变体要么用魔术字符串(路径)或字符串常量(当我把路径放在那里时)来填充类......

任何提示都会被贬低。

编辑:这适用于Wicket 1.4,因为Wicket 1.5使用EventBus解决了这个问题

2 个答案:

答案 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);
}

实现这些接口并因此可以参与事件机制的类包括:ComponentRequestCycleSessionApplication

该机制允许在此定义不同的事件广播方法:

/**
 * 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)弹出窗口到页面打开器