Flex 学习笔记------全局事件

全局事件

在学习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()

 

posted on 2013-08-06 16:58  花森  阅读(448)  评论(0编辑  收藏  举报