• 自定义事件类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];
            }
        }
    
    }
     
  • 相关阅读:
    微软面试题_中文字符串转换为数字
    微软面试题_3个字母的组合
    LeetCode Notes_#1031_两个非重叠子数组的最大和
    剑指Offer_#57-II_和为 s 的连续正数序列
    LeetCode Notes_#560 和为k的子数组
    LeetCode Notes_#84 柱状图中最大的矩形
    LeetCode Notes_#221 最大正方形
    LeetCode Notes_#146 LRU缓存机制
    码云团队开发项目拉取与推送
    vue父子组件的双向绑定
  • 原文地址:https://www.cnblogs.com/gamedaybyday/p/7722116.html
Copyright © 2020-2023  润新知