如何附加全局事件侦听器?

时间:2012-02-17 22:38:38

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

我正在开发AIR应用程序:

主窗口就像一个仪表板。通过菜单栏,我可以打开其他带有仪表板详细信息的窗口。当我关闭它们时,我想刷新主窗口。

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

感谢您的帮助。

3 个答案:

答案 0 :(得分:2)

您正在寻找单身人士。只需将事件调度程序放入其中,您就可以从应用程序的任何位置进行监听。

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

以下是有关如何使用它的代码示例。

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

注意:单身人士既强大又危险,同时有很多关于如何使用它们的讨论,如果你正在考虑建立一个大项目,请多读一点。

希望它有所帮助!

答案 1 :(得分:1)

问题在于您是从View执行业务逻辑。不要这样做。相反,从每个菜单调度一个事件,而不是直接从其中打开窗口。在更高级别侦听这些事件,然后您可以直接侦听已打开的新窗口,也可以创建一个公开IEventDispatcher类型变量的基本窗口类。如果您使用相同的事件调度程序填充该变量,那么您最终会将其称为“事件总线”,并且您可以监听事件。

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

答案 2 :(得分:0)

您可以通过向其添加事件侦听器来直接侦听对象(EventDispatcher),或者如果调度程序对象位于displaylist上,例如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类也至少可以帮助您确定在代码库中使用它的位置。无论哪种方式,您都必须小心引用和内存泄漏。