123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384 |
- class Listener{
- //关注的消息
- private _event: string = '';
- //消息对应的事件
- private _callback: Function = null;
- //回调函数的this指向
- private _callTarget: any = null;
- constructor(ev: string, callback: Function, target: any = null){
- this._event = ev;
- this._callback = callback;
- this._callTarget = target;
- }
- hasCallBack(func: Function){
- return this._callback === func;
- }
- callback(...args){
- this._callback.apply(this._callTarget,[...args]);
- }
- }
- class MessageMgr{
- static instance: MessageMgr = null;
- //考虑多个观察者 关注同一个消息的情况
- private _listeners: Map<string, Listener[]> = new Map();
- //注册消息
- addEvent(ev: string, callback: Function, target: any = null){
- const lis: Listener = new Listener(ev, callback, target);
- if(this._listeners.has(ev)){
- //如果消息已经被某个观察者关注了 那么找到那个数组 把新的观察者也存进去
- this._listeners.get(ev).push(lis);
- return;
- }
- //把消息和观察者对应存储
- //先创建一个Listener类型的数组
- const liss: Listener[] = [];
- //把第一个对应ev的观察者存储起来
- liss.push(lis);
- //把消息和存listener的数组 存到map 中
- this._listeners.set(ev, liss);
- }
- //激活消息
- dispatch(event: string, ...args){
- this._listeners.forEach((liss: Listener[], ev: string)=>{
- //遍历整个map 判断传递进来的消息 是否和某个键值对的键 相同
- if(event === ev){
- for(const lis of liss){
- lis.callback(...args);
- }
- }
- })
- }
- //移除事件
- removeEvent(event: string | Function){
- if(typeof(event) === "string"){
- this._listeners.delete(event);
- return;
- }
- for(const liss of Array.from(this._listeners.values())){
- for(let i = 0; i < liss.length; i++){
- if(liss[i].hasCallBack(event)){
- liss.splice(i , 1);
- return;
- }
- }
- }
- }
- //移除所有事件
- removeAll(){
- this._listeners.clear();
- }
- }
- export const messageMgr: MessageMgr = MessageMgr.instance = new MessageMgr();
|