import { TreeNodeKeyType } from '../types' import TreeNode from './tree-node' interface IListenersMap { [eventName: string]: Function[] } type NodeGeneralListenerType = (node: TreeNode) => void export type ListenerType = IEventNames[T] export interface IEventNames { 'set-data': () => void 'visible-data-change': () => void 'render-data-change': () => void expand: NodeGeneralListenerType select: NodeGeneralListenerType unselect: NodeGeneralListenerType 'selected-change': ( node: TreeNode | null, key: TreeNodeKeyType | null ) => void check: NodeGeneralListenerType uncheck: NodeGeneralListenerType 'checked-change': (nodes: TreeNode[], keys: TreeNodeKeyType[]) => void } export default class TreeEventTarget { /** 事件 listeners */ private listenersMap: IListenersMap = {} on( eventName: T, listener: ListenerType | Array> ): void { if (!this.listenersMap[eventName]) { this.listenersMap[eventName] = [] } let listeners: Array> = [] if (!Array.isArray(listener)) { listeners = [listener] } else { listeners = listener } listeners.forEach(listener => { if (this.listenersMap[eventName].indexOf(listener) === -1) { this.listenersMap[eventName].push(listener) } }) } off( eventName: T, listener?: ListenerType ): void { if (!this.listenersMap[eventName]) return if (!listener) { this.listenersMap[eventName] = [] } else { const index = this.listenersMap[eventName].indexOf(listener) if (index > -1) { this.listenersMap[eventName].splice(index, 1) } } } emit( eventName: T, ...args: Parameters ): void { if (!this.listenersMap[eventName]) return const length: number = this.listenersMap[eventName].length for (let i: number = 0; i < length; i++) { this.listenersMap[eventName][i](...args) } } disposeListeners(): void { for (const eventName in this.listenersMap) { this.listenersMap[eventName] = [] } } }