gpt4 book ai didi

coding-style - 风格问题 - 成员变量与 get(path)

转载 作者:行者123 更新时间:2023-12-02 06:40:47 25 4
gpt4 key购买 nike

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

使 A 成为父组件的成员变量,而不是使用父组件的 get(path) 方法。两种变体似乎都有优点和缺点,从“更好”代码的角度来看,我真的无法决定哪个更好......

第一个变体是稳定的,即使 (A) 的路径发生了变化,但是让父级变得杂乱无章,这些成员很少使用。另一种变体会产生更清晰的父类,但会在组件层次结构发生变化时增加多个故障点。另外这个变体要么用魔术字符串(路径)或字符串常量(当我把路径放在那里)乱扔类......

任何提示将不胜感激。

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

最佳答案

改用 Wicket 1.5 的事件机制来使用 Ajax 更新组件。这样,您将解耦发布者和订阅者。例如,请参阅我关于新的 features in Wicket 1.5 given at JavaZone'11 的演示文稿(跳到谈话大约 51 分钟)。

取自 Wicket 1.5 发行说明:

组件间事件

Wicket 1.5 为组件以解耦的方式相互通信提供了一种简单而灵活的方式。促进这一点的两个主要接口(interface)是:

/**
* 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);
}

实现这些接口(interface)并因此可以参与事件机制的类是: Component , RequestCycle , Session , 和 Application .

该机制允许在此处定义不同的事件广播方法:
/**
* Defines the event broadcast type.
*/
public enum Broadcast {
BREADTH,
DEPTH,
BUBBLE,
EXACT;
}

有一个 example in wicket-examples这演示了 this 的用法。

应用程序可以在 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);
}
}
}

关于coding-style - 风格问题 - 成员变量与 get(path),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8445263/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com