zoukankan      html  css  js  c++  java
  • 自定义事件类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];
            }
        }
    
    }
     
  • 相关阅读:
    nginx限制某个IP同一时间段的访问次数
    在64位机器上使用yum install特定指定安装32位的库
    pl sql developer连接oracle数据库提示:ORA12541: TNS: no listener
    [转]Eclipse中几种加入包方式的区别
    Oracle安装出现Can't connect to X11 window
    [转]ORACLE10GR2,dbca时ora27125错误解决方法
    [转]教你如何进入google国际版 不跳转g.cn 及 opendns
    安装oracle遇到的故障
    [转]宝文!Apple Push Notification Service (APNS)原理与实现方案
    [转]关于安卓与ios的推送系统,我说说自己的看法。
  • 原文地址:https://www.cnblogs.com/gamedaybyday/p/7722116.html
Copyright © 2011-2022 走看看