124 lines
2.9 KiB
JavaScript
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;
|