在學習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()