2012-02-17 40 views
1

我正在使用AIR应用程序:如何附加全局事件侦听器?

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

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

感谢您的帮助。

+0

我编辑了你的措辞,使你的问题更容易理解 - 我希望我的意思是正确的......你能添加一个你正在尝试什么,或者你的事件监听器不起作用的例子吗?有些代码会很好。 – weltraumpirat 2012-02-17 23:03:22

回答

0

您可以通过向其添加事件侦听器直接侦听对象(EventDispatcher),或者如果调度器对象位于显示列表上(如Sprite),则可以在阶段级别侦听捕获参数设置为真正。

但主要的警告是,调度员必须在舞台上为你抓住这个事件。

你的主窗口监听级(与捕获= TRUE):使用舞台的消息

dispatchEvent(new Event("MY_CUSTOM_EVENT")); 

但(AB):

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 
} 

你的子窗口可以分派这样的活动以这种方式传递定制事件的基础设施有点混乱。如果你真的想要这种通信,你可以考虑一个更正式的消息传递架构。即使是一个静态的MessageBus类,至少可以快速帮助你确定你在代码库中使用的地方。无论哪种方式,你都必须小心引用和内存泄漏。

+0

我不认为单独的NativeWindows具有相同的阶段。 – 2012-02-18 00:44:38

+0

啊,好点。太糟糕了,我不能投我自己的答案。 =) – 2012-02-21 16:59:56

+0

您可以要求将其删除 – 2012-02-21 18:47:56

2

辛格尔顿是你在找什么。只需将一个事件调度程序放在里面,您就可以在应用程序的任何地方收听。

单例就像在内存中有一个唯一的对象实例,所以任何人修改该对象内的变量(或发送事件通过)将被修改为每个人。

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

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

注:单身是强大的,并在同一时间的危险,有一个谈了很多关于如何使用它们,请阅读多一点了解,如果你正在考虑建立一个大项目。

希望它有帮助!

1

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

这个架构比使用Singleton需要多一点思考,但是它避免了通过在项目中引入一个紧耦合和其他问题。

相关问题