在学习Flex的过程当中,NavigatorContent 能够将不一样的页面分离,这样很好的下降了代码的耦合度。但不一样子页面间的数据传递或事件响应则显得稍微复杂。app
例如:学习
<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头部加上:flex
<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 之间进行通讯,固然两者是不可以直接进行通讯的。须要借助一个"第三方"和全局变量,设置全局变量主要有两种方式:spa
parentDocument 获取的是子页面的直接父文档对象,这里指代的就是 ViewStack 组件对象,能够在该组件中存如一些属性变量。code
parentApplication 获取的是最顶级的 Application 对象,对于一个完整的 Flex 项目来讲,Application 对象只有一个,且每一个子页面均可以获取到该对象的引用。所以也能够在 Application 中定义一些变量或方法。xml
若是以为在 Application 中管理这些变量或状态会使代码看上去比较臃肿,且耦合严重,这时能够适当的将这些变量抽象出来,组成一个静态类(窃习惯将之命名为Global.as)。这个类中声明的变量或方法都是静态的 static,为类全部,该类没有实例变量。对象
上面两种方式只能作到共享全局变量,但没法触发状态的更改。所以这里须要一个全局事件。blog
全局事件是一个自定义事件,代码以下:事件
/** * 分发全局事件 全部的类均可以监听 */ 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()