【教程】【FLEX】#003 自定义事件、模块间通讯
本篇笔记,主要阐明 事件是如何创建 和 如何使用自定义事件达到模块之间通讯 的效果。
句子解释:
什么叫做模块之间的通讯呢??
简单点说,就是两个模块之间可以互相传数据。 A模块 可以接收到 B模块的数据,这个就叫做通讯。
所以A模块注册了一个事件, B模块触发了这个事件,A接收到。 那么 这个就是A、B模块进行通讯了。
一、自定义事件的创建(代码例子在文章底部)
1、创建一个ActionScript类,继承Event
2、声明属性
2.1 保存数据的属性(事件保存数据的对象,可多个)
2.2 用来指定事件的类型,和一个用来EventDispatcher对象,派发事件(注意:事件类型和EventDispachaer对象必须是唯一的。所以例子里面加上了 const)
3、创建一个构造函数,把声明的几个属性,初始化。
4、重载父类的clone方法
二、两个问题说明一下
Q1:为什么需要设置一个EventDispatcher来派发事件?
A:1. 先说一下 不用 EventDispatcher对象来派发的局限性。(只能在父子组件之间传递数据)
2. 用EventDispatcher对象来派发有什么好处呢?
可以在任何一个地方监听到任意一个组件被触发(派发)的事件。
原因:引用地址:http://blog.csdn.net/nature_fly088/article/details/8496446
事件当然要发生在事件目标上,比如点击按钮时,事件目标就是按钮。在Flex应用中,任何显示页面上的对象都可能成为事件目标,换句话说,都能够触发事件。而这种特性全拜flash.events.EventDispatcher类所赐。
EventDispatcher类实现IEventDispatcher接口,并且是DisplayObject类的基类(DisplayObject 类是可放在显示列表中的所有对象类的基类)。EventDispatcher类允许显示列表上的任何对象都是一个事件目标,而同时,又使得这些对象能够侦听事件。
Q2:为什么需要重载clone方法?
A:一个自定义事件如果不重载clone的时候,正常使用不出问题。
但是、如果这个事件要进行中继(被继续派发。就是注册事件的时候处理方法里面又继续派发事件)的话,就必须重载。
引用地址: http://www.360doc.com/content/12/1018/14/8343463_242213532.shtml
错误:Error #1034:强制转换类型失败:无法将flash.events::Event@5e514f1转换为...的错误
(把错误写在这里,方便搜索到)

三、自定义事件写完了,那么如何注册,如何派发它呢?
3.1 注册事件:
还记得创建自定义类的时候,说要声明一个唯一的EventDispatcher对象吗?
就是用它,来进行注册事件的。派发也是哦。
eg: (注意:例子和下面的自定义事件是相对应的)
//参数1:事件类型; 参数2:事件派发后的处理方法 SetPropertyPanelEvent.dis.addEventListener(SetPropertyPanelEvent.INITPROPERTY,handler);
3.2 派发事件:
eg:
//实例化一个事件对象 var e:SetPropertyPanelEvent = new SetPropertyPanelEvent( SetPropertyPanelEvent.INITPROPERTY, control, datas ); //当作参数传递给事件派发(派发后,就会 通知所有有注册 这个事件(类型必须一致)的对象去处理) SetPropertyPanelEvent.dis.dispatchEvent( e );
代码例子。
package
{
import flash.display.DisplayObject;
import flash.events.Event;
import flash.events.EventDispatcher;
/**
* 传值事件(自定义事件)
* ==>解释:注册本事件,可以传送数据对象(此处用于1、当生成控件之后,把控件信息传给属性面板; 2、当控件大小、位置改变,传值给属性面板)
* @author zhongxia
* @time 2014-12-25 08:47:31
*/
public class SetPropertyPanelEvent extends Event
{
//指定事件的类型,设置多种类型,可以让这个自定义事件有不同的用途
public static const INITPROPERTY:String = "INITPROPERTY"; //初始化属性事件
public static const CHANGEPROPERTY:String = "CHANGEPROPERTY"; //修改属性值事件
public static const CHANGECONTROL:String="CHANGECONTROL"; //控件修改事件
//派发事件的对象
public static const dis:EventDispatcher = new EventDispatcher();
//控件对象(保存数据)
public var control:DisplayObject;
public var obj:Object;
/**
* 构造函数(初始化属性)
* @param type 控件类型
* @param control 控件对象
* @param obj 创建的时候传一些自定义属性 默认为Null
* @param Boolean 是否冒泡,默认为false
* @param cancelable 是否允许取消事件 默认为false
*/
public function SetPropertyPanelEvent(type:String,control:DisplayObject,obj:Object=null, bubbles:Boolean=false, cancelable:Boolean=false)
{
super(type, bubbles, cancelable);
this.control = control;
this.obj = obj;
} /**
* 自定义事件必须重写父类的这个方法
* @return 该事件的实例
*/
override public function clone():Event{
return new SetPropertyPanelEvent(type,control,obj,bubbles,cancelable);
}
}
}
package
{
import flash.display.DisplayObject;
import flash.events.Event;
import flash.events.EventDispatcher;
/**
* 传值事件(自定义事件)
* ==>解释:注册本事件,可以传送数据对象(此处用于1、当生成控件之后,把控件信息传给属性面板; 2、当控件大小、位置改变,传值给属性面板)
* @author zhongxia
* @time 2014-12-25 08:47:31
*/
public class SetPropertyPanelEvent extends Event
{
//指定事件的类型,设置多种类型,可以让这个自定义事件有不同的用途
public static const INITPROPERTY:String = "INITPROPERTY"; //初始化属性事件
public static const CHANGEPROPERTY:String = "CHANGEPROPERTY"; //修改属性值事件
public static const CHANGECONTROL:String="CHANGECONTROL"; //控件修改事件
//派发事件的对象
public static const dis:EventDispatcher = new EventDispatcher();
//控件对象(保存数据)
public var control:DisplayObject;
public var obj:Object;
/**
* 构造函数(初始化属性)
* @param type 控件类型
* @param control 控件对象
* @param obj 创建的时候传一些自定义属性 默认为Null
* @param Boolean 是否冒泡,默认为false
* @param cancelable 是否允许取消事件 默认为false
*/
public function SetPropertyPanelEvent(type:String,control:DisplayObject,obj:Object=null, bubbles:Boolean=false, cancelable:Boolean=false)
{
super(type, bubbles, cancelable);
this.control = control;
this.obj = obj;
}
/**
* 自定义事件必须重写父类的这个方法
* @return 该事件的实例
*/
override public function clone():Event{
return new SetPropertyPanelEvent(type,control,obj,bubbles,cancelable);
}
}
}
代码文件下载:
【教程】【FLEX】#003 自定义事件、模块间通讯的更多相关文章
- Flex之自定义事件
1.通过dispatchEvent委托事件模式完成自定义事件: <?xml version="1.0" encoding="utf-8"?> < ...
- (尚031)Vue_案例_自定义事件(组件间通信第2种方式:vue自定义事件)
自定义事件: 我们知道,父组件使用prop传递数据的子组件,但子组件怎么跟父组件通信呢? 这个时候Vue的自定义事件系统就派得上用场了. 自定义事件知道两件事: (1).绑定 (2).触发 注意:$o ...
- 自定义事件实现不同窗体间的通讯Delphi篇
要实现子窗体与父窗体之间的通讯,有多种方法(比如:重载子窗体的构造函数,将父窗体的引用作为参数传递给子窗体).下面我要介绍的是利用自定义事件的方法,它能够最大程度的避免模块之间的耦合,充分体现面向对象 ...
- Flex事件机制学习-自定义事件实现类间通信 .
今天,学习Flex自定义事件,可以使两个类通信,定义一个Main类. public class Main extends Sprite { public function ...
- Prism for WPF再探(基于Prism事件的模块间通信)
上篇博文链接 Prism for WPF初探(构建简单的模块化开发框架) 一.简单介绍: 在上一篇博文中初步搭建了Prism框架的各个模块,但那只是搭建了一个空壳,里面的内容基本是空的,在这一篇我将实 ...
- Flex 自定义事件
一.分派自定义事件类型 任何实现flash.event.IEventDispatcher接口的对象都可以分派事件,这包括所有显示对象和一些非显示对象类.通常,对于 自定义的非显示类,可以通过扩展fla ...
- vue_组件间通信:自定义事件、消息发布与订阅、槽
自定义事件 只能用于 子组件 向 父组件 发送数据 可以取代函数类型的 props 在父组件: 给子组件@add-todo-event="addTodo" 在子组件: 相关方法中, ...
- FLEX自定义事件
有时候我们需要让两个组件之间实现联动,并且在其中传递数据,自定义事件机制可以帮助我们比较优雅的实现这种需要. 下面的例子,是打算实现一个列表和一个编辑框的联动. 编辑框代码 <?xml vers ...
- flex中dispatchEvent的用法(自定义事件) .
Evevt和EventDispatcher类在as3的事件机制中是很重要的角色,dispatchEvent()是EventDispatcher类的一个事件发送方法,它可以发送出Event类或其子类的实 ...
随机推荐
- MySQL中order by中关于NULL值的排序问题
MySQL中order by 排序遇到NULL值的问题 MySQL数据库,在order by排序的时候,如果存在NULL值,那么NULL是最小的,ASC正序排序的话,NULL值是在最前面的. 如果我们 ...
- SQL Server附加数据库文件出错
场景: 新装一台数据库服务器,装好后,附加数据库时出错.附加前的数据库架构没有在新服务器上安装.新服务器上只有默认dbo架构. 解决: 以windows身份验证登录,附加正常. 错误码可能为5120. ...
- android关于AndroidManifest.xml详细分析
http://my.eoe.cn/1087692/archive/5927.html 一.关于AndroidManifest.xmlAndroidManifest.xml 是每个android程序中必 ...
- Html4与Html5的关键区别
HTML5是下一代HTML标准版本,4与5有很多相同之处,有HTML从头构建,比4升级到5要方便. 以下是10个关键区别: 1.HTML5最近很火,但是标准还在制定,4则十年之多了,不会6变: 2.简 ...
- 访问修饰符private
private(C# 参考) private 关键字是一个成员访问修饰符. 私有访问是允许的最低访问级别. 私有成员只有在声明它们的类和结构体中才是可访问的,如下例所示: class Employee ...
- PL/SQL中查看列注释、列属性
- NYOJ16 矩形嵌套(DAG最长路)
矩形嵌套 紫书P262 这是有向无环图DAG(Directed Acyclic Graph)上的动态规划,是DAG最长路问题 [题目链接]NYOJ16-矩形嵌套 [题目类型]DAG上的dp & ...
- NeHe OpenGL教程 第二十五课:变形
转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...
- python 爬虫抓取心得
quanwei9958 转自 python 爬虫抓取心得分享 urllib.quote('要编码的字符串') 如果你要在url请求里面放入中文,对相应的中文进行编码的话,可以用: urllib.quo ...
- mapreduce执行流程
角色描述:JobClient:执行任务的客户端JobTracker:任务调度器TaskTracker:任务跟踪器Task:具体的任务(Map OR Reduce) 从生命周期的角度来看,mapredu ...