假设我有一个在我的应用程序中的2个位置使用的组件C.例如,我有一个文件夹列表,显示在2个选项卡中。当用户在一个部分中重命名文件夹时,此更改也应反映在另一个部分中。
我正在考虑使用EventBus,并使文件夹组件触发EventBus事件,比如FolderChangedEvent。此事件将被第二个文件夹组件截获,该组件将自动更新其文件夹列表。
问题是,如果我想在某个位置在第3个位置使用此文件夹组件,这个位置也会更新文件夹列表。这可能不是应用程序的理想行为。
通常,我会让Folder组件有一个自己的addFolderChangedHandler(...)方法,但由于这个组件非常复杂并且有子组件,这可能会创建意大利面条类型的代码。但是,我不认为这个组件应该包含任何特定于应用程序的逻辑,并且直接在应用程序的EventBus中抛出事件,这对于它来说太高级了。
此案例的最佳做法是什么?如何有效使用EventBus?
答案 0 :(得分:5)
事件总线的目的是使事件处理更容易,是的,使代码更易读和易于管理。我会回答这个问题,假设你的困境在于如何对事件进行分类。
GWTEvent类有一个source()方法。这告诉你是谁解雇了这个事件。 如果这是不可接受的,那么您的事件中始终可以有一个“id”字段,由发件人填充。因此,如果TreeView1正在触发事件,则事件的id将设置为“treeView1”。当事件处理程序收到此事件时,它将检查id并决定是否处理该事件。这样,您就可以为整个应用程序使用单个“God”事件处理程序。
答案 1 :(得分:0)
eventBus非常适合基本实现,但我发现在复杂的应用程序中需要使用Event发送数据,例如在触发MyObjectCreated事件时创建的新NyObject。
GWT-Structs library中有一个很好的实现。查看动态发布商 - 订阅者绑定的example,了解如何通过类型化的发布者和订阅者传递数据。