一个自定义事件类

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

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

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

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

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

使用自定义事件类后

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

  1. handler(data){
  2. //不需从e中获取data
  3. }

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

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

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

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

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

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

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

  1. /**
  2. * 事件管理类
  3. * 一个全局的Event类
  4. * @author chenkai
  5. * @date 2016/8/30
  6. */
  7. class EventMananger extends SingleClass{
  8. /**事件列表*/
  9. private eventList = {};
  10.  
  11. /**
  12. * 发送事件
  13. * @type 事件类型
  14. * @args 携带数据
  15. */
  16. public sendEvent(type:string,...args:any[]){
  17. var arr:Array<any> = this.eventList[type];
  18. if(arr != null){
  19. var len = arr.length;
  20. var listen:Function;
  21. var thisObject:any;
  22. for(var i=;i<len;i++){
  23. var msg = arr[i];
  24. listen = msg[];
  25. thisObject = msg[];
  26. listen.apply(thisObject, args);
  27. }
  28. }
  29. }
  30.  
  31. /**
  32. * 监听事件
  33. * @type 事件类型
  34. * @listener 回调函数
  35. * @thisObject 回调执行对象
  36. */
  37. public addEvent(type:string, listener:Function, thisObject:any){
  38. var arr:Array<any> = this.eventList[type];
  39. if(arr == null){
  40. arr = [];
  41. this.eventList[type] = arr;
  42. }else{
  43. var len = arr.length;
  44. for(var i=;i<len;i++){
  45. if(arr[i][] == listener && arr[i][] == thisObject){
  46. return;
  47. }
  48. }
  49. }
  50. arr.push([listener, thisObject]);
  51. }
  52.  
  53. /**
  54. * 移除事件
  55. * @type 事件类型
  56. * @listener 回调函数
  57. * @thisObject 回调执行对象
  58. */
  59. public removeEvent(type:string ,listener, thisObject:any){
  60. var arr:Array<any> = this.eventList[type];
  61. if(arr != null){
  62. var len = arr.length;
  63. for(var i = len-; i>=;i--){
  64. if(arr[i][] == listener && arr[i][] == thisObject){
  65. arr.splice(i,);
  66. }
  67. }
  68. }
  69. if(arr && arr.length == ){
  70. this.eventList[type] = null;
  71. delete this.eventList[type];
  72. }
  73. }
  74.  
  75. }

自定义事件类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. 怎样编写socket套接字

    watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/ ...

  2. 历届蓝桥杯C/C++省赛试题

    2012年第三届蓝桥杯C/C++程序设计本科B组省赛 2013年第四届蓝桥杯C/C++程序设计本科B组省赛 2014年第五届蓝桥杯C/C++程序设计本科B组省赛 2015年第六届蓝桥杯C/C++程序设 ...

  3. 重要:C/C++变量的自动初始化

    对于内置变量的自动初始化 代码1: #include<stdio.h> #define CONST 100 int *p1; ]; int b; static int c; main() ...

  4. div 点击展开

    <script type="text/javascript" src="http://libs.baidu.com/jquery/2.1.1/jquery.min. ...

  5. 第二百九十五节,python操作redis缓存-字符串类型

    python操作redis缓存-字符串类型 首先要安装redis-py模块 python连接redis方式,有两种连接方式,一种是直接连接,一张是通过连接池连接 注意:以后我们都用的连接池方式连接,直 ...

  6. LabVIEW中数组的自动索引

    我们在LabVIEW里面使用While或者是For循环结构的时候,就会发现每一个循环中在它们的循环结构的边界都可以自动完成一个数组元素的索引或累积.LabVIEW中循环结构的这种能力就叫做自动索引(A ...

  7. 解决myeclipse4.1.1对一个表生成映射文件的时候,出现“generating artifacts"的解决!

    很多人在用myeclipse4.1.1对一个表生成映射文件的时候,都出现“generating artifacts"的问题.我也遇到了这个问题,弄得我也很郁闷!看了很多人的帖子后还是无法搞定 ...

  8. Oracle 11gR2 11.2.0.1 ( 11.2.0.1的BUG?):ohasd不能正常启动:ioctl操作:npohasd的问题:【chmod a+wr /var/tmp/.oracle/npohasd】

    问题1:执行安装,编译成功后,执行asmca时,失败,无法成功创建后台相关服务 问题2:os系统重启后,ohasd无法正常启动,css服务失败 原因:11.2.0.1的BUG:/var/tmp/.or ...

  9. 关于Java 枚举类型的自定义属性

    package com.cpic.test;/** * 关于枚举类型自定义属性 * */public enum Provious { ANHUI("皖", 1),BAIJING(& ...

  10. 关于 MVVMLight 设计模式系列

    MVVM设计模式你可以在WPF.Silverlight.Windows Phone开发中使用,我想至今已经有非常非常多的朋友正在使用MVVM设计模式,尤其是MVVMLight . 本系列文章以WPF举 ...