上一篇主要以代码的方式说明了如何使用自定义事件在父子组件之间传递数据,那么在开发中,我们可能会遇到另一种情况,就是想在任意一个地方监听到任意一个组件中被触发的事件,这样事件处理更灵活,并不局限于父子组件之间,那么下面就说明这种情况如何处理。

Flex中所有的组件都间接继承自EventDispatcher,通过查看Flex API,了解一下这个类中的方法。       

如图所见,该类包含了派发事件、监听事件、移出事件等方法,那么通过这个类就可以实现本文开篇所提出的那种情况,分析一下,监听事件的对象和派发事件的对象必须是同一个对象,这样事件才能被捕获,所以我们需要写一个单例的类,并且组合EventDispatcher,可以满足需求。

events/MyEventDispatcher.as,这里同样不建议以My起头命名,只是测试用。

package events
{import events.MyEvent; import flash.events.Event;import flash.events.EventDispatcher;import flash.events.IEventDispatcher; import mx.core.Singleton;public class MyEventDispatcher{private static var _inst:MyEventDispatcher;private var eventDispatcher:IEventDispatcher;public function MyEventDispatcher(singleton:Singleton){if(singleton == null){throw new Error("Create MyEventDispatcher Error!");}eventDispatcher = new EventDispatcher();}public static function getInstance():MyEventDispatcher{if (!_inst){_inst = new MyEventDispatcher(new Singleton);}return _inst;}public function addEventListener(type:String, listener:Function, useCapture:Boolean=false, pririty:int=0, useWeakReference:Boolean=true):void{eventDispatcher.addEventListener(type, listener, useCapture, pririty, useWeakReference);}public function removeEventListener(type:String, listener:Function, useCapture:Boolean=false, priority:int=0, useWeakReference:Boolean=true):void{eventDispatcher.removeEventListener(type, listener, useCapture);}public function dispatchEvent(event:MyEvent):Boolean{return eventDispatcher.dispatchEvent(event);}public function hasEventListener(type:String):Boolean{return eventDispatcher.hasEventListener(type);}public function willTrigger(type:String):Boolean{return eventDispatcher.willTrigger(type);}}
}
class Singleton {}
为了节省空间,类里不加注释了,其实也不要紧,功能很简单,组合了EventDispatcher对象,对其做了一层代理,并且对MyEventDispatcher单例话,为什么采用单例上面已经说过了,但是为什么使用组合而不是继承呢,在OOPS(面向对象程序设计系统)中,有一条原则是优先使用组合而非继承,组合比继承更灵活,组合允许在运行期间通过设置类的属性来改变类的行为,并且可以使用接口来组合一个类,提供了更高的灵活性。
到目前为止,我们的工作已经完成一大半了,在上一篇中设计了一个自定义事件类,也就是events/MyEvent.as,我们可以在该类中加入一个dispatch方法,创建完事件之后可以派发,代码如下:       
/*** 派发事件* @return */
public function dispatch():Boolean
{return MyEventDispatcher.getInstance().dispatchEvent(this);
}

这样,创建完自定义事件之后,就可以直接派发事件了,那么使用起来就很方便了,下面是具体使用代码,一个应用中有两个自定义组件,组件一中有个TextArea,组件二中有个按钮,点击按钮,将数据传递到TextArea中。
EventTest.mxml
<?xml version="1.0" encoding="utf-8"?>
<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" minWidth="955" minHeight="600" xmlns:components="components.*"><s:layout><s:VerticalLayout/></s:layout><components:component1 /><components:component2 />
</s:Application>

components/component1.mxml

<?xml version="1.0" encoding="utf-8"?>
<s:Group xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark" xmlns:mx="library://ns.adobe.com/flex/mx"creationComplete="creationCompleteHandler(event)"><fx:Script><![CDATA[import events.MyEventDispatcher;import events.MyEvent;import mx.events.FlexEvent;           protected function creationCompleteHandler(event:FlexEvent):void{MyEventDispatcher.getInstance().addEventListener(MyEvent.SHOWINFO, showInfo);}         protected function showInfo(event:MyEvent):void{textArea.text = event.data;}           ]]></fx:Script><s:TextArea id="textArea" />
</s:Group>

components/component2.mxml

<?xml version="1.0" encoding="utf-8"?>
<s:Group xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark" xmlns:mx="library://ns.adobe.com/flex/mx"> <fx:Script><![CDATA[import events.MyEvent;import events.MyEventDispatcher;protected function buttonClickHandler(event:MouseEvent):void{var myEvent:MyEvent = new MyEvent(MyEvent.SHOWINFO);myEvent.data = "哈哈";myEvent.dispatch();}]]></fx:Script><s:Button label="显示内容" click="buttonClickHandler(event)"/>
</s:Group>

好,这样就实现了在任意一个地方监听到任意一个组件中被触发的事件的功能,文中如有错误之处,欢迎指出,大家共同进步。

本文来自:高爽|Java And Flex Corder,原文地址:http://blog.csdn.net/ghsau/article/details/7396614。

转载于:https://www.cnblogs.com/ghsau/archive/2012/03/26/2768555.html

Flex事件机制(三)相关推荐

  1. Flex事件机制(一)

          Flex事件贯穿我们整个开发,事件分为两类,用户事件和系统事件,比如说我们在页面点击了一个按钮,这是用户触发的事件,当组件初始化完毕,会触发creationComplete事件,这是系统事 ...

  2. FLEX事件机制整理

    一.引 很多新人对Flex的事件机制都不太熟悉,在使用过程中难免会出现各种问题,这是一个非常普遍的问题,为了更快更好的帮助大家,将介绍一下Flex中事件的各种机制和用法. Flex的精髓之一就是事件和 ...

  3. Flex事件机制(二)

    上一篇简单的介绍了Flex的事件机制以及处理事件的四种方式,本篇的主要内容是利用自定义事件在父子组件之间传递数据. 在Flex开发中,很多时候需要在父子组件之间传递数据,通过事件可以实现数据的传递,现 ...

  4. Android 触摸事件机制(三) View中触摸事件详解

    本文将对View中触摸事件相关的内容进行介绍.重点介绍的是dispatchTouchEvent(), onTouchEvent()这两个API以及OnTouchListener接口. 注意:本文是基于 ...

  5. 【Android 事件分发】事件分发源码分析 ( ViewGroup 事件传递机制 三 )

    Android 事件分发 系列文章目录 [Android 事件分发]事件分发源码分析 ( 驱动层通过中断传递事件 | WindowManagerService 向 View 层传递事件 ) [Andr ...

  6. Web Control 开发系列(三) 解析IPostBackEventHandler和WebForm的事件机制

    WebForm最大的魅力大概就是它自己的一套事件处理机制了,要做一个好的Control,必须深入理解这套机制,只有这样才可以让我们的Control有一整套Professional的Event,而IPo ...

  7. gtest之断言宏的使用以及三种事件机制

    前面简单的介绍了一下gtest以及在Windows下如何安装gtest,今天再介绍一下在Linux下该如何安装. 本文重点: 在Linux下如何安装gtest: gtest下断言宏的介绍: gtest ...

  8. 「前端面试题系列7」Javascript 中的事件机制(从原生到框架)

    前言 这是前端面试题系列的第 7 篇,你可能错过了前面的篇章,可以在这里找到: 理解函数的柯里化 ES6 中箭头函数的用法 this 的原理以及用法 伪类与伪元素的区别及实战 如何实现一个圣杯布局? ...

  9. jQuery中的事件机制深入浅出

    昨天呢,我们大家一起分享了jQuery中的样式选择器,那么今天我们就来看一下jQuery中的事件机制,其实,jQuery中的事件机制与JavaScript中的事件机制区别是不大的,只是,JavaScr ...

最新文章

  1. golang:1.并发编程之互斥锁、读写锁详解
  2. mysql 报错10614_golang使用go-sql-driver实现mysql增删改操作-Go语言中文社区
  3. 截取字符串指定内容,并用*号代替
  4. 获取电脑的唯一识别码_教你如何知道自己的电脑能够装黑苹果
  5. Android的intent之间复杂参数的传递
  6. IDEA 快捷键终极大全
  7. 本土链雷达网_走向本土设计
  8. 基于事件驱动架构构建微服务第15部分:SPA前端
  9. linux c之通过popen执行shell命令
  10. Java系列之雪花算法和原理
  11. 卖不动了,5G资费套餐再降价,网友:再等等再等等
  12. html列表按时间排序代码_把 Linux 上的文件列表和排序玩出花来 | Linux 中国
  13. MyBatis基础入门--知识点总结
  14. matlab 中文注释乱码问题解决
  15. WIN7 vc2008【fatal error C1083: 无法打开文件:“Windows.h”: No such file or directory】【cl.exe link.exe手动调用编译】
  16. SnagIt - 官方网站
  17. rtmp协议官方规范
  18. echarts饼图自动动画_echarts实时旋转饼图效果特效
  19. 阿里java开发规范学习笔记 (V1.5华山版)
  20. Android Launcher3简介

热门文章

  1. 谷歌分析中的营销归因分析功能
  2. 开发板移植mysql_数据库移植到gpu
  3. 人工智能语言python招聘_编程语言这么多为什么选Python
  4. 图像形状特征(四)--轮廓树及PGH
  5. 图像局部特征(六)--斑点检测之SIFT算法原理总结补充
  6. 嵌入式系统——电子设计
  7. oracle 设置会话的编码,在Oracle中使用登录触发器初始化用户会话
  8. php行为和事件是什么,Yii Framework框架中事件和行为的区别及应用实例分析
  9. scala json处理入门
  10. Win32汇编——文件操作