panlippt
Version:
运行在浏览器中的ppt 演示框架
113 lines (106 loc) • 3.83 kB
JavaScript
/**
* 广播事件处理
* 状态:稳定
*
* 目标: 为了尽可能的减少模块之间业务逻辑的耦合度, 而开发了这个eventbus, 主要用于业务逻辑的事件传递
* 使用规范: 每个js模块尽可能通过事件去通信, 减少模块之间的直接调用和依赖(耦合)
* 使用示例:
* //触发
* MixJS.event.broadcast.fire('abc',{abc:1})
* //订阅
* MixJS.event.broadcast.on('abc',function(a){
* console.log(a);
* }, scope);
* @return {[type]}
* @author theowang
* $Id: broadcast.js 65871 2012-11-05 01:51:42Z theowang $
*/
MixJS.define('event/broadcast', function($) {
var _cache = {};
var broadcast = {
/**
* 派发
* @param {[type]} type 事件类型
* @param {[type]} data 回调数据
* @return {[type]} [description]
*/
fire: function(type, data) {
var listeners = _cache[type],
len = 0;
if (!$.isUndefined(listeners)) {
var args = [].slice.call(arguments, 0);
args = args.length > 2 ? args.splice(2, args.length - 1) : [];
args = [data].concat(args);
len = listeners.length;
for (var i = 0; i < len; i++) {
var listener = listeners[i];
if (listener && listener.callback) {
args = args.concat(listener.args);
listener.callback.apply(listener.scope, args);
}
}
}
return this;
},
/**
* 订阅广播事件
* @param {[type]} types 事件类型,支持,分隔符
* @param {Function} callback 回调函数
* @param {[type]} scope 回调函数上下文
* @return {[type]} this
*/
on: function(types, callback, scope) {
types = types || [];
var args = [].slice.call(arguments);
if ($.isString(types)) {
types = types.split(',');
}
var len = types.length;
if (len === 0) {
return this;
}
args = args.length > 3 ? args.splice(3, args.length - 1) : [];
for (var i = 0; i < len; i++) {
var type = types[i];
_cache[type] = _cache[type] || [];
_cache[type].push({
callback: callback,
scope: scope,
args: args
});
}
return this;
},
/**
* 退订
* @param {[type]} type [description]
* @param {Function} callback 假如传入则移出传入的监控事件,否则移出全部
* @return {[type]} [description]
*/
un: function(type, callback, scope) {
var listeners = _cache[type];
if (!listeners) {
return this;
}
if (callback) {
var len = listeners.length,
tmp = [];
for (var i = 0; i < len; i++) {
var listener = listeners[i];
if (listener.callback == callback && listener.scope == scope) {} else {
tmp.push(listener);
}
}
listeners = tmp;
} else {
listeners.length = 0;
}
return this;
},
removeAll: function() {
_cache = {};
return this;
}
};
return broadcast;
});