一个自定义事件类
初衷是使用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=0;i<len;i++){ var msg = arr[i]; listen = msg[0]; thisObject = msg[1]; 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=0;i<len;i++){ if(arr[i][0] == listener && arr[i][1] == 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-1; i>=0;i--){ if(arr[i][0] == listener && arr[i][1] == thisObject){ arr.splice(i,1); } } } if(arr && arr.length == 0){ this.eventList[type] = null; delete this.eventList[type]; } } }