ts事件

/**
 * 单个事件类
 */
export class Event {
    /** 回调函数 */
    private callback: Function = null;
    /** 节点 */
    private context: any = null;
 
    constructor(callback: Function, context: any) {
        this.callback = callback;
        this.context = context;
    }
 
    /**
     * 调用
     * @param args 
     */
    notify(...args: any[]): void {
        this.callback.call(this.context, ...args);
    }
 
    /**
     * 节点
     * @param context 
     */
    compare(context: any): boolean {
        return context == this.context;
    }
}


/**
 * 事件消息处理
 */
export class eventManager {
    /** 监听数组 */
    private static eventList = {};
 
    /** 
     * 注册事件
     * @param name 事件名称
     * @param callback 回调函数
     * @param context 上下文
     */
    static on(name: string, callback: Function, context: any) {
        let events: Event[] = this.eventList[name];
        if (!events) {
            this.eventList[name] = [];
        }else{
            console.log("重复注册,两个事件,会调用两次哦。")
        }
        this.eventList[name].push(new Event(callback, context));
    }
 
    /**
     * 移除事件
     * @param name 事件名称
     * @param context 上下文
     */
    static off(name: string, context: any) {
        let events: Event[] = this.eventList[name];
        if (!events) return;
        let length = events.length;
        for (let i = 0; i < length; i++) {
            let event = events[i];
            if (event.compare(context)) {
                events.splice(i, 1);
                break;
            }
        }
        if (events.length == 0) {
            delete this.eventList[name];
        }
    }
 
    /**
     * 发送事件
     * @param name 事件名称
     */
    static publish(name: string, ...args: any[]) {
        let events: Event[] = this.eventList[name];
        if (!events) {
            console.log("还没有注册该事件:" + name)
            return;
        }
        let length = events.length;
        for (let i = 0; i < length; i++) {
            let event = events[i];
            event.notify(...args);
        }
    }
}
 
posted @ 2020-10-22 10:12  稻盛信徒  阅读(503)  评论(0)    收藏  举报