typescript事件通知机制

来源:互联网 发布:清除mysql表碎片 编辑:程序博客网 时间:2024/05/21 17:06

PS: 本文参考PureMVC

用到的模式是观察者模式,本来是自己想要一个事件通知机制,刚好看到pureMVC,于是单独把里面的事件通知剥离出来单独用,只有静态的方法,如果你想要考虑复用的话, 可以把静态改掉。代码如下

emitter.ts代码如下

/** * 事件 */export class Emitter {    /** 监听数组 */    private static listeners = {};    /**      * 注册事件     * @param name 事件名称     * @param callback 回调函数     * @param context 上下文     */    public static register(name: string, callback: Function, context: any) {        let observers: Observer[] = Emitter.listeners[name];        if (!observers) {            Emitter.listeners[name] = [];        }        Emitter.listeners[name].push(new Observer(callback, context));    }    /**     * 移除事件     * @param name 事件名称     * @param callback 回调函数     * @param context 上下文     */    public static remove(name: string, callback: Function, context: any) {        let observers: Observer[] = Emitter.listeners[name];        if (!observers) return;        let length = observers.length;        for (let i = 0; i < length; i++) {            let observer = observers[i];            if (observer.compar(context)) {                observers.splice(i, 1);                break;            }        }        if (observers.length == 0) {            delete Emitter.listeners[name];        }    }    /**     * 发送事件     * @param name 事件名称     */    public static fire(name: string, ...args: any[]) {        let observers: Observer[] = Emitter.listeners[name];        if (!observers) return;        let length = observers.length;        for (let i = 0; i < length; i++) {            let observer = observers[i];            observer.notify(name, ...args);        }    }}/** * 观察者 */class Observer {    /** 回调函数 */    private callback: Function = null;    /** 上下文 */    private context: any = null;    constructor(callback: Function, context: any) {        let self = this;        self.callback = callback;        self.context = context;    }    /**     * 发送通知     * @param args 不定参数     */    notify(...args: any[]): void {        let self = this;        self.callback.call(self.context, ...args);    }    /**     * 上下文比较     * @param context 上下文     */    compar(context: any): boolean {        return context == this.context;    }}

测试代码:

import {Emitter} from "./emitter";class Test{    constructor(){        let self = this;        Emitter.register("nihao", self.test, self);    }    public test(eventName:string, args1:string, args2:number){        console.log(eventName, args1, args2);        console.log(arguments);    }}let a = new Test();Emitter.fire("nihao", "cyrwpj", 1);

参数是不定的,需要什么传什么。

1 0
原创粉丝点击