在Meteor项目中的观察者模式封装
写成类的形式的好处是,在每个要使用的文件中引入,创建一个observer实例,就会有一个单独的管理对象_manager
class Observer {
constructor() {
this._manager = {};
}
regist(eventName, fn) {
if (typeof this._manager[eventName] === 'undefined') {
this._manager[eventName] = [fn];
} else {
this._manager[eventName].push(fn);
}
}
regist_once(eventName, fn) {
if (typeof this._manager[eventName] === 'undefined') {
this._manager[eventName] = [fn];
}
}
fire(eventName, args) {
if (!this._manager[eventName]) {
console.error('观察者中还没有注册' + eventName + '事件')
return
}
for (let i = 0; i < this._manager[eventName].length; i++) {
this._manager[eventName][i].apply(this, args)
}
}
removeFunctionFromEvent(eventName, fn) {
if (this._manager[eventName] instanceof Array) {
for (let i = this._manager[eventName].length - 1; i >= 0; i--) {
this._manager[eventName][i] === fn && this._manager[eventName].splice(i, 1);
}
}
}
removeEvent(eventName) {
delete this._manager[eventName];
}
}
module.exports = Observer;
- _manager 是一个对象,它的键是事件名,它的值是内容为函数的数组,当触发这个事件时就将数组中的所有函数执行一遍;
- regist方法用于注册事件,参数是事件名和回调函数,可以为同一个事件注册多个不同的函数;
- regist_once用于注册事件,但是如果已经存在了,就不能再注册了。
- fire是触发事件的方法,参数是事件名和传递的参数;
- removeFunctionFromEvent,是从事件中移除某回调
- removeEvent是移除事件