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