【问题标题】:How do I attach a global event listener?如何附加全局事件侦听器?
【发布时间】:2012-02-17 22:38:38
【问题描述】:

我正在开发一个 AIR 应用程序:

主窗口就像一个仪表板。使用菜单栏,我可以打开其他包含仪表板详细信息的窗口。当我关闭这些时,我想刷新主窗口。

我尝试使用事件监听器,但结果并不好。如果我直接从主窗口打开详细信息窗口,我知道如何添加事件侦听器 - 它可以工作 - 但如果详细信息窗口是从菜单栏打开的,我不知道该怎么做!

谢谢你帮助我。

【问题讨论】:

  • 我编辑了你的措辞,让你的问题更容易理解 - 我希望我的意思是正确的......你能添加一个你尝试了什么的例子,或者你的事件监听器为什么没有工作?一些代码会很好。

标签: actionscript-3 apache-flex events air flash-builder


【解决方案1】:

单身人士正是您要寻找的。只需在其中放置一个事件调度程序,您就可以在应用程序的任何地方进行监听。

Singleton 就像在内存中拥有一个对象的唯一实例,因此任何人修改该对象内的变量(或通过 t 发送事件)都会为每个人修改。

这是一个关于如何使用它的代码示例。

http://life.neophi.com/danielr/2006/10/singleton_pattern_in_as3.html

注意:Singleton 既强大又危险,有很多关于如何使用它们的讨论,如果您正在考虑构建一个大型项目,请阅读更多相关内容。

希望对你有帮助!

【讨论】:

    【解决方案2】:

    问题是您正在从视图执行业务逻辑。不要这样做。相反,从每个菜单分派一个事件,而不是直接从其中打开窗口。在更高级别监听这些事件,然后您可以直接监听您打开的新窗口,也可以创建一个基窗口类,该类公开一个 IEventDispatcher 类型的变量。如果您使用相同的事件调度程序填充该变量,您最终得到的就是所谓的“事件总线”,您可以在其上监听事件。

    与使用 Singleton 相比,这种架构需要更多的思考,但它避免了紧密耦合以及通过将其引入项目中会遇到的其他问题。

    【讨论】:

      【解决方案3】:

      你可以通过添加一个事件监听器直接监听一个对象(EventDispatcher),或者如果dispatcher对象在显示列表中,比如Sprite,你可以在舞台级别监听,捕获参数设置为true .

      但主要的警告是调度员必须在舞台上才能让您捕捉到这个事件。

      您的主窗口监听舞台(capture = true):

      stage.addEventListener("MY_CUSTOM_EVENT", handle_custom_event, true);
      
      private function handle_custom_event(e:Event):void
      {
        var sub_window:Object = e.target;
        // do something to your sub_window
      }
      

      您的子窗口可以像这样调度事件:

      dispatchEvent(new Event("MY_CUSTOM_EVENT"));
      

      但是(ab)以这种方式使用舞台作为自定义事件的消息传递基础设施有点混乱。如果您真的想要这种通信,您可以考虑更正式的消息传递架构。即使是静态 MessageBus 类也至少可以快速帮助您确定在代码库中使用它的位置。无论哪种方式,您都必须小心引用和内存泄漏。

      【讨论】:

      • 我不认为单独的NativeWindows有相同的阶段。
      • 啊,好点子。太糟糕了,我不能投票给我自己的答案。 =)
      • 您可以要求将其删除
      • 也许问题不是在谈论 NativeWindows ......无论如何,所有答案都是潜在的相关信息,这就是为什么我没有要求将其删除,但我确实投票支持其他答案。 =)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-26
      • 1970-01-01
      • 2013-06-23
      • 2023-02-23
      • 2019-06-27
      相关资源
      最近更新 更多