/** * 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;