事件监听
1、实现的逻辑
- 使用单例
- key,value的形式,储存事件
private _eventListeners: { [key: string]: CallBackTarget[] } = {}; - 事件监听,使用开放方法on
/**添加监听(会做所有不重复的事件监听) * @param eventName 事件名字 * @param callBack 事件回调函数 * @param target 目标类 * */ on(eventName: string, callBack: EventMaCallFunc, target?: any): boolean { if (!eventName) { DEBUG && console.error("eventName is empty" + eventName); return false; } if (null == callBack) { DEBUG && console.error('addEventListener callBack is nil'); return false; } let callTarget: CallBackTarget = { callBack: callBack, target: target }; if (null == this._eventListeners[eventName]) { this._eventListeners[eventName] = [callTarget]; } else { let index = this.getEventListenersIndex(eventName, callBack, target); if (-1 == index) { this._eventListeners[eventName].push(callTarget); } } return true; }
- 移除事件监听
/**移除监听 * @param eventName 事件名字 * @param callBack 事件回调函数 * @param target 目标类 * */ of(eventName: string, callBack: EventMaCallFunc, target?: any) { if (null != this._eventListeners[eventName]) { let index = this.getEventListenersIndex(eventName, callBack, target); if (-1 != index) { this._eventListeners[eventName].splice(index, 1); } } } private getEventListenersIndex(eventName: string, callBack: EventMaCallFunc, target?: any): number { let index = -1; for (let i = 0; i < this._eventListeners[eventName].length; i++) { let iterator = this._eventListeners[eventName][i]; if (iterator.callBack == callBack && (!target || iterator.target == target)) { index = i; break; } } return index; }
- 调用事件
/**提高监听条件 * @param eventName 事件名字 * @param eventData 事件回调参数 * */ raiseEvent(eventName: string, eventData?: any) { DEBUG && console.log(`==================== raiseEvent ${eventName} begin | ${JSON.stringify(eventData)}`); if (null != this._eventListeners[eventName]) { // 将所有回调提取出来,再调用,避免调用回调的时候操作了事件的删除 let callbackList: CallBackTarget[] = []; for (const iterator of this._eventListeners[eventName]) { callbackList.push({ callBack: iterator.callBack, target: iterator.target }); } for (const iterator of callbackList) { iterator.callBack.call(iterator.target, eventName, eventData); } } DEBUG && console.log(`==================== raiseEvent ${eventName} end`); }

浙公网安备 33010602011771号