全局事件
在学习Flex的过程中,NavigatorContent 可以将不同的页面分离,这样很好的降低了代码的耦合度。但不同子页面间的数据传递或事件响应则显得稍微复杂。
例如:
<mx:ViewStack id="viewStack" resizeToContent="true" horizontalCenter="0"> <s:NavigatorContent id="fabricSelectContent" label="子页面1" creationPolicy="auto"> <subpages:myPage1/> </s:NavigatorContent> <s:NavigatorContent id="patternUploadContent" label="子页面2"> <subpages:myPage2/> </s:NavigatorContent> </mx:ViewStack>
这里就将 myPage1 和 myPage2 两个子页面分离了,这样两个页面的功能可以单独编写。subpages是自定义的一个命名空间,需要在 application头部加上:
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark" xmlns:mx="library://ns.adobe.com/flex/mx" xmlns:subpages="*" >
如果这时 myPage2 需要获取 myPage1 的数据或者 myPage1 中的某个状态变换需要改变 myPage2 中的某个状态,即 myPage1 需要与 myPage2 之间进行通信,当然二者是不能够直接进行通信的。需要借助一个"第三方"和全局变量,设置全局变量主要有两种方式:
1. parentApplication / parentDocument
parentDocument 获取的是子页面的直接父文档对象,这里指代的就是 ViewStack 组件对象,可以在该组件中存如一些属性变量。
parentApplication 获取的是最顶级的 Application 对象,对于一个完整的 Flex 项目来说,Application 对象只有一个,且每个子页面都可以获取到该对象的引用。因此也可以在 Application 中定义一些变量或方法。
2. as 自定义类
如果觉得在 Application 中管理这些变量或状态会使代码看上去比较臃肿,且耦合严重,这时可以适当的将这些变量抽象出来,组成一个静态类(窃习惯将之命名为Global.as)。这个类中声明的变量或方法都是静态的 static,为类所有,该类没有实例变量。
上面两种方式只能做到共享全局变量,但无法触发状态的更改。因此这里需要一个全局事件。
全局事件是一个自定义事件,代码如下:
/** * 分发全局事件 所有的类都可以监听 */ package events { import flash.events.EventDispatcher; import flash.events.IEventDispatcher; public class Dispatcher extends EventDispatcher { private static var instance:Dispatcher; public function Dispatcher(target:IEventDispatcher = null) { super(target); } public static function getInstance():Dispatcher { if (instance == null) { instance = new Dispatcher(); } return instance; } } }
监听事件:
Dispatcher.getInstance().addEventListener()
触发事件:
Dispatcher.getInstance().dispatchEvent()