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; } }