一个自定义事件类

初衷是使用Egret的事件有两点比较麻烦

1   在事件处理函数时,需要从e中获取data

hander(e:egret.Event){
let data = e.data;
}

2   派发事件需要填写额外参数

this.dispatchEvent(new egret.Event("xxx"));
this.dispatchEventWith("xxx", false, data);

使用自定义事件类后

1 事件处理函数获取data较容易

handler(data){
//不需从e中获取data
}

2  派发事件不需填写额外参数

eventManager.sendEvent("xxx")
eventManager.sendEvent("xxx", data)

其中一点使用..args:any[]

public sendEvent(type:string,...args:any[])
listen.apply(thisObject, args)

也可以直接改成 data:any = null

public sendEvent(type:string, data:any = null)
listen.call(thisObject, data)

两者区别在于..args:any[]可以传递多个参数

/**
* 事件管理类
* 一个全局的Event类
* @author chenkai
* @date 2016/8/30
*/
class EventMananger extends SingleClass{
/**事件列表*/
private eventList = {}; /**
* 发送事件
* @type 事件类型
* @args 携带数据
*/
public sendEvent(type:string,...args:any[]){
var arr:Array<any> = this.eventList[type];
if(arr != null){
var len = arr.length;
var listen:Function;
var thisObject:any;
for(var i=;i<len;i++){
var msg = arr[i];
listen = msg[];
thisObject = msg[];
listen.apply(thisObject, args);
}
}
} /**
* 监听事件
* @type 事件类型
* @listener 回调函数
* @thisObject 回调执行对象
*/
public addEvent(type:string, listener:Function, thisObject:any){
var arr:Array<any> = this.eventList[type];
if(arr == null){
arr = [];
this.eventList[type] = arr;
}else{
var len = arr.length;
for(var i=;i<len;i++){
if(arr[i][] == listener && arr[i][] == thisObject){
return;
}
}
}
arr.push([listener, thisObject]);
} /**
* 移除事件
* @type 事件类型
* @listener 回调函数
* @thisObject 回调执行对象
*/
public removeEvent(type:string ,listener, thisObject:any){
var arr:Array<any> = this.eventList[type];
if(arr != null){
var len = arr.length;
for(var i = len-; i>=;i--){
if(arr[i][] == listener && arr[i][] == thisObject){
arr.splice(i,);
}
}
}
if(arr && arr.length == ){
this.eventList[type] = null;
delete this.eventList[type];
}
} }

自定义事件类EventManager (TS中...args的使用例子)的更多相关文章

  1. cocos2dx自定义事件类封装

    GameEvent.h: #pragma once #include "cocos2d.h" USING_NS_CC; class GameEvent { public: //封装 ...

  2. 编写一个自定义事件类,包含on/off/emit/once方法

    function Event() { this._events = {}; } Event.prototype.on = function(type, fn) { if (!this._events[ ...

  3. DragonBones龙骨骨骼中的自定义事件(另有声音、动画事件)

    参考: DragonBones骨骼动画事件系统详解 一.在DragonBones中添加自定义事件帧 动画制作时 时间轴拉到最下面有一个事件层,添加一个事件帧 左边属性面板定义自定义事件 二.Egret ...

  4. 【转】Flash AS3.0 中的自定义事件

    原文 http://www.cnblogs.com/acpp/archive/2010/10/19/1855670.html package { import flash.events.Event; ...

  5. Java Spring 自定义事件监听

    ApplicationContext 事件 定义一个context的起动监听事件 import org.springframework.context.ApplicationListener; imp ...

  6. [置顶] flex4事件监听与自定义事件分发(三)

    1.我们来说一下自定义事件子类.什么时候创建新的事件类以及怎么创建. (1)说一下,我们什么时候需要自定义事件类.举例说明,在flex中事件的基类是Event,而当我们点击某个按钮或者是单击某个组件的 ...

  7. kettle系列-[KettleUtil]kettle插件,类似kettle的自定义java类控件

    该kettle插件功能类似kettle现有的定义java类插件,自定java类插件主要是支持在kettle中直接编写java代码实现自定特殊功能,而本控件主要是将自定义代码转移到jar包,就是说自定义 ...

  8. js自定义事件、DOM/伪DOM自定义事件

    一.说明.引言 我JS还是比较薄弱的,本文的内容属于边学边想边折腾的碎碎念,可能没什么条理,可能有表述不准确的地方,可能内容比较拗口生僻.如果您时间紧迫,或者JS造诣已深,至此您就可以点击右侧广告(木 ...

  9. 由自定义事件到vue数据响应

    前言 除了大家经常提到的自定义事件之外,浏览器本身也支持我们自定义事件,我们常说的自定义事件一般用于项目中的一些通知机制.最近正好看到了这部分,就一起看了下自定义事件不同的实现,以及vue数据响应的基 ...

随机推荐

  1. mvn 仓库地址修改

    默认仓库的存储位置 Maven缺省的本地仓库路径为${user.home}/.m2/repository具体如下图 自定义修改仓库的存储位置: 可改变默认的 .m2 目录下的默认本地存储库文件夹通过修 ...

  2. 手工配置oracle数据库

    手工配置Oracle 10G Enterprise Manager今天安装oracle,反复装了几遍都报下面错误:试了几种方法都不行:由于以下错误,Enterprise Manager配置失败启动Da ...

  3. MATLAB中常用的排列、组合、阶乘函数

    1.求n的阶乘,方法如下:a.factorial(n)b.gamma(n+1)c.v='n!'; vpa(v) 2.求组合(数),方法如下:a.combntns(x,m)    列举出从n个元素中取出 ...

  4. WordCount示例深度学习MapReduce过程

    转自: http://blog.csdn.net/yczws1/article/details/21794873 . 我们都安装完Hadoop之后,按照一些案例先要跑一个WourdCount程序,来测 ...

  5. (转)分析kernel的initcall函数

      分析kernel的initcall函数   来源: ChinaUnix博客 日期: 2008.07.19 21:24 (共有条评论) 我要评论   分析kernel的initcall函数Autho ...

  6. Win10開始菜单打不开

    一.前言 自从用Win10之后(附上<我的Win10之旅>).用清理软件.总是深度清理,导致rt问题. 每次百度都是没用的解决方法: 今天,再一次清理(Wise Care 365 注冊表深 ...

  7. while循环中,break,continue,return的差别

    break 结束循环,跳出循环体: continue 结束本次循环.进行下次循环: return 跳出循环体所在的方法,相当于跳出循环体.

  8. informatica中的workflow连接远程数据库

    如果是远程oracle这样写 名称随便起,方便自己记住,后面用户名密码你都知道,再加上数据库的地址:端口/SID就可以了. 如10.33.2.208:1521/torcl

  9. mysql中,如何查看数据库中当前可用的校勘?字符集默认的collation?

    需求描述: mysql的字符集在使用的过程中会有一些规则,这些规则就组成了校勘, 也就是通过什么规则做什么事,比如,如何比较两个字符的大小,后台都是有一些 规则,这些规则就是校勘的一部分. 那么,查看 ...

  10. leetCode 33.Search in Rotated Sorted Array(排序旋转数组的查找) 解题思路和方法

    Search in Rotated Sorted Array Suppose a sorted array is rotated at some pivot unknown to you before ...