magix
Version:
view manager framewrok
99 lines (98 loc) • 2.52 kB
JavaScript
/*#if(!modules.mini){#*/
/**
* 多播事件对象
* @name Event
* @namespace
*/
let MEvent = {
/**
* @lends MEvent
*/
/**
* 触发事件
* @param {String} name 事件名称
* @param {Object} data 事件对象
* @param {Boolean} [remove] 事件触发完成后是否移除这个事件的所有监听
* @param {Boolean} [lastToFirst] 是否从后向前触发事件的监听列表
*/
fire(name, data, remove, lastToFirst) {
let key = G_SPLITER + name,
me = this,
list = me[key],
end, len, idx, t;
if (!data) data = {};
data.type = name;
if (list) {
end = list.length;
len = end - 1;
while (end--) {
idx = lastToFirst ? end : len - end;
t = list[idx];
if (t.f) {
t.x = 1;
G_ToTry(t.f, data, me);
t.x = G_EMPTY;
} else if (!t.x) {
list.splice(idx, 1);
len--;
}
}
}
list = me[`on${name}`];
if (list) G_ToTry(list, data, me);
if (remove) me.off(name);
return me;
},
/**
* 绑定事件
* @param {String} name 事件名称
* @param {Function} fn 事件处理函数
* @example
* let T = Magix.mix({},Magix.Event);
* T.on('done',function(e){
* alert(1);
* });
* T.on('done',function(e){
* alert(2);
* T.off('done',arguments.callee);
* });
* T.fire('done',{data:'test'});
* T.fire('done',{data:'test2'});
*/
on(name, f) {
let me = this;
let key = G_SPLITER + name;
let list = me[key] || (me[key] = []);
list.push({
f
});
return me;
},
/**
* 解除事件绑定
* @param {String} name 事件名称
* @param {Function} [fn] 事件处理函数
*/
off(name, fn) {
let key = G_SPLITER + name,
me = this,
list = me[key],
t;
if (fn) {
if (list) {
for (t of list) {
if (t.f == fn) {
t.f = G_EMPTY;
break;
}
}
}
} else {
delete me[key];
delete me[`on${name}`];
}
return me;
}
};
Magix.Event = MEvent;
/*#}#*/