initial commit
This commit is contained in:
commit
4b60ece582
327 changed files with 28286 additions and 0 deletions
94
libjs/utils/subscribable.js
Normal file
94
libjs/utils/subscribable.js
Normal file
|
@ -0,0 +1,94 @@
|
|||
"use strict";
|
||||
|
||||
var Class = require("./class");
|
||||
|
||||
var Subscribable = Class.inherit({
|
||||
"className": "Subscribable",
|
||||
"constructor": function() {
|
||||
Class.fn.constructor.call(this);
|
||||
|
||||
this._events = Object.create(null);
|
||||
},
|
||||
"destructor": function() {
|
||||
this.off();
|
||||
Class.fn.destructor.call(this);
|
||||
},
|
||||
|
||||
"on": function(name, handler, context) {
|
||||
var handlers = this._events[name];
|
||||
|
||||
if (typeof name !== "string") {
|
||||
throw new Error("Name of event is mandatory");
|
||||
}
|
||||
|
||||
if (!(handler instanceof Function)) {
|
||||
throw new Error("Handler of event is mandatory");
|
||||
}
|
||||
|
||||
if (!handlers) {
|
||||
handlers = [];
|
||||
this._events[name] = handlers;
|
||||
}
|
||||
|
||||
handlers.push({
|
||||
handler: handler,
|
||||
context: context || this,
|
||||
once: false
|
||||
});
|
||||
},
|
||||
"one": function(name) {
|
||||
Subscribable.fn.on.apply(this, arguments);
|
||||
this._events[name][this._events[name].length - 1].once = true;
|
||||
},
|
||||
"off": function(name, handler, context) {
|
||||
|
||||
if (typeof name === "string") {
|
||||
if (this._events[name]) {
|
||||
if (handler instanceof Function) {
|
||||
var handlers = this._events[name];
|
||||
for (var i = handlers.length - 1; i >= 0 ; --i) {
|
||||
if (handlers[i].handler === handler) {
|
||||
if (context) {
|
||||
if (handlers[i].context === context) {
|
||||
handlers.splice(i, 1);
|
||||
}
|
||||
} else {
|
||||
handlers.splice(i, 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
delete this._events[name];
|
||||
}
|
||||
}
|
||||
} else {
|
||||
this._events = Object.create(null);
|
||||
}
|
||||
},
|
||||
"trigger": function() {
|
||||
var args = [].slice.call(arguments);
|
||||
if (args.length === 0) {
|
||||
throw new Error("Name of event is mandatory");
|
||||
}
|
||||
var answer = false;
|
||||
var name = args.shift();
|
||||
var handlers = this._events[name];
|
||||
if (handlers) {
|
||||
for (var i = 0; i < handlers.length; ++i) {
|
||||
var handle = handlers[i];
|
||||
answer = handle.handler.apply(handle.context, args);
|
||||
if (handle.once) {
|
||||
handlers.splice(i, 1);
|
||||
--i;
|
||||
}
|
||||
|
||||
if (answer === false) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
return answer;
|
||||
}
|
||||
});
|
||||
|
||||
module.exports = Subscribable;
|
Loading…
Add table
Add a link
Reference in a new issue