3

假设我有一个组件 C 在我的应用程序的两个地方使用。例如,我有一个显示在 2 个选项卡中的文件夹列表。当用户重命名文件夹的一部分时,此更改也应反映在另一部分中。

我正在考虑为此使用 EventBus 并使文件夹组件触发 EventBus 事件,例如 FolderChangedEvent。此事件将被第二个文件夹组件拦截,该组件将自动更新其文件夹列表。

问题是如果我想在某个时候在第三个地方使用这个文件夹组件,这个地方也会更新文件夹列表。这可能不是应用程序的期望行为。

通常,我会让 Folder 组件有一个自己的 addFolderChangedHandler(...) 方法,但是由于这个组件非常复杂并且有子组件,这可能会创建意大利面条式的代码。但是,我不觉得这个组件应该包含任何特定于应用程序的逻辑并直接在应用程序的 EventBus 中引发事件,这对它来说太高级了。

这种情况下的最佳实践是什么?您如何有效地使用 EventBus?

4

2 回答 2

5

事件总线的目的是使事件处理更容易,是的,使代码更具可读性和可管理性。假设您的困境在于如何对事件进行分类,我将回答这个问题。

GWTEvent 类有一个 source() 方法。这会告诉您谁触发了该事件。如果这是不可接受的,那么您始终可以在您的事件中拥有一个由发件人填充的“id”字段。因此,如果 TreeView1 正在触发事件,则事件的 id 将设置为“treeView1”。当事件处理程序接收到这个事件时,它将检查 id 并决定是否处理该事件。这样,您可以为整个应用程序使用单个“上帝”事件处理程序。

于 2012-03-19T20:35:13.530 回答
0

eventBus 非常适合基本实现,但我发现在复杂的应用程序中需要使用 Event 发送数据,例如在触发 MyObjectCreated 事件时创建的新 NyObject。

在GWT-Structs library中有一个很好的实现。请参阅动态发布者-订阅者绑定示例,以了解如何使用类型化发布者和订阅者传递数据。

于 2012-03-19T21:19:30.060 回答