Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将EventBus与GWT组件一起使用的最佳实践_Gwt_Event Bus - Fatal编程技术网

将EventBus与GWT组件一起使用的最佳实践

将EventBus与GWT组件一起使用的最佳实践,gwt,event-bus,Gwt,Event Bus,假设我有一个组件C,在我的应用程序中有两个地方使用。例如,我有一个文件夹列表,显示在两个选项卡中。当用户重命名一个部分中的文件夹时,此更改也应反映在另一部分中 我正在考虑使用EventBus来实现这一点,并使folders组件触发一个EventBus事件,比如FolderChangedEvent。此事件将被第二个文件夹组件截获,该组件将自动更新其文件夹列表 问题是,如果我想在某个时候在第三个地方使用这个文件夹组件,这个地方也会更新文件夹列表。这可能不是应用程序所需的行为 通常,我会让文件夹组件有

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

我正在考虑使用EventBus来实现这一点,并使folders组件触发一个EventBus事件,比如FolderChangedEvent。此事件将被第二个文件夹组件截获,该组件将自动更新其文件夹列表

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

通常,我会让文件夹组件有一个自己的addFolderChangedHandler(…)方法,但是由于这个组件非常复杂,并且有子组件,这可能会创建意大利面类型的代码。但是,我觉得这个组件不应该包含任何特定于应用程序的逻辑,也不应该直接在应用程序的EventBus中抛出事件,因为EventBus的级别太高了


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

事件总线的目的是使事件处理更容易,是的,使代码更易于阅读和管理。假设你的难题是如何对事件进行分类,我将回答这个问题

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

eventBus对于基本实现很好,但我发现在复杂的应用程序中,需要随事件发送数据,例如在触发MyObjectCreated事件时创建的新NyObject

在中有一个很好的实现。请参见动态发布服务器订阅者绑定中的部分,了解如何通过键入的发布服务器和订阅者传递数据