pubgv3/assets/scripts/jcfw/common/notification.js
zhuguoqing babca2ed7c update
2022-05-26 12:17:15 +08:00

124 lines
2.9 KiB
JavaScript

/**
* Created by y.x on 16/11/8.
*/
var signals = require("signals");
var notification = {
_signals: [],
_cachebinds: {},
_findSignal: function(eEvent) {
var i, signal;
for(i = this._signals.length; i--;) {
signal = this._signals[i];
if(signal.event === eEvent) {
return signal;
}
}
return null;
},
/**
* @param {Number} [eEvent]
* @param {Function} [fnListener]
* @param {Object} [oTarget]
* @return {Object}
*/
createBinding: function(eEvent, fnListener, oTarget) {
// find signal
var signal = this._findSignal(eEvent);
// find unused signal
if(signal === null) {
signal = this._findSignal(null);
}
// create new signal
if(signal === null) {
signal = new signals.Signal();
this._signals.push(signal);
}
// bind listener
if(signal) {
signal.event = eEvent;
return signal.add(fnListener, oTarget);
}
},
/**
* @param {Object|Array} [oBinding] createSignalBinding
*/
removeBinding: function(oBinding) {
var bindings = oBinding instanceof Array ? oBinding : [oBinding];
for(var i = bindings.length; i--;) {
var one = bindings[i],
signal = one.getSignal();
one.detach();
if(signal && signal.getNumListeners() == 0) {
signal.event = null;
}
}
},
/**
*/
on(eEvent, fnListener, oTarget){
let obj = this._cachebinds[eEvent];
if(!obj){
obj = [];
this._cachebinds[eEvent] = obj;
}
let ob = obj.find((element) => {
return element.listener == fnListener && element.target == oTarget;
});
if(ob){
return ob.binding;
}
let bd = this.createBinding(eEvent, fnListener, oTarget);
ob = {
listener: fnListener,
target: oTarget,
binding: bd
};
obj.push(ob);
return bd;
},
/**
*/
off(eEvent, fnListener, oTarget){
let obj = this._cachebinds[eEvent];
if(!obj){
return;
}
let idx = obj.findIndex((element) => {
return element.listener == fnListener && element.target == oTarget;
});
if(idx < 0){
return;
}
let ob = obj[idx];
this.removeBinding(ob.binding);
obj.splice(idx, 1);
},
/**
* @param {Number} [eEvent]
*/
emit: function(eEvent) {
var signal = this._findSignal(eEvent);
if(signal) {
signal.dispatch.apply(this, arguments);
}
}
};
module.exports = notification;