UNPKG

magix

Version:

view manager framewrok

99 lines (98 loc) 2.52 kB
/*#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; /*#}#*/