/** * ### 全局事件管理 * * ```js * // 注册 * Events.register("eventName", () => { * // 触发执行 * }); * * // 触发 * Events.emit("eventName", '支持参数'); * * // 移除 * Events.remove("eventName"); * ``` */ export default class Events { // 监听数组 private static listeners = new Map[]>(); /** * 注册事件(会叠加) * * @param key 事件名称 * @param callback 回调函数 */ public static register(key: T, callback: Function) { const observers: Observer[] | undefined = Events.listeners.get(key); if (!observers) { Events.listeners.set(key, []); } Events.listeners.get(key)?.push(new Observer(key, callback)); } /** * 重置并注册(不会叠加) * * @param key 事件名称 * @param callback 回调函数 */ public static reset(key: T, callback: Function) { Events.listeners.set(key, []); this.register(key, callback); } /** * 移除事件 * * @param key 事件名称 */ public static remove(key: T) { const observers: Observer[] | undefined = Events.listeners.get(key); if (observers) { for (let i = 0, l = observers.length; i < l; i++) { if (observers[i].equals(key)) { observers.splice(i, 1); break; } } } Events.listeners.delete(key); } /** * 触发事件 * * @param key 事件名称 * @param args 参数 */ public static emit(key: T, ...args: any[]) { const observers: Observer[] | undefined = Events.listeners.get(key); if (observers) { for (const observer of observers) { // 通知 observer.notify(...args); } } } } /** 观察者 */ class Observer { private callback: Function = () => {}; // 回调函数 private readonly key: T; constructor(key: T, callback: Function) { this.key = key; this.callback = callback; } /** * 发送通知 * * @param args 不定参数 */ notify(...args: any[]): void { this.callback.call(this.key, ...args); } equals(name: any): boolean { return name === this.key; } }