自定义事件类EventManager (TS中...args的使用例子)

一个自定义事件类

初衷是使用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];
        }
    }

}
 
原文地址:https://www.cnblogs.com/gamedaybyday/p/7722116.html