Cocos Creator中使用事件中心


export class EventCenter {
    /** 監聽數組 */
    private listeners = {};

    /** 
    * 注冊事件
    * @param name 事件名稱
    * @param callback 回調函數
    * @param context 上下文
    */
    public register(name: string, callback: Function, context: any) {
        let observers: Observer[] = this.listeners[name];
        if (!observers) {
            this.listeners[name] = [];
        }
        this.listeners[name].push(new Observer(callback, context));
    }

    /**
    * 移除事件
    * @param name 事件名稱
    * @param callback 回調函數
    * @param context 上下文
    */
    public remove(name: string, context: any) {
        let observers: Observer[] = this.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 this.listeners[name];
        }
    }

    /**
    * 發送事件
    * @param name 事件名稱
    */
    public fire(name: string, ...args: any[]) {
        let observers: Observer[] = this.listeners[name];
        if (!observers) return;
        let length = observers.length;
        for (let i = 0; i < length; i++) {
            let observer = observers[i];
            observer.notify(name, ...args);
        }
    }
}

/*************************************************************/

/**
* 觀察者
*/
export 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;
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM