一個自定義事件類
初衷是使用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]; } } }