evento
Version:
Publish–subscribe pattern implementation
134 lines (114 loc) • 3.32 kB
JavaScript
;(function() {
function Evento() {};
Evento.prototype = {
/**
* Registered events map
*/
events: {},
/**
* Resets all event listeners
*/
clear: function()
{
this.events = {};
},
/**
* Returns all registered events
*/
getEvents: function()
{
return this.events;
},
/**
* Check if event is registered
*/
hasEvent: function(name)
{
return this.events[name] !== undefined;
},
//TODO: this needs refactoring!
isRegistered: function(name, callback, context)
{
if (this.hasEvent(name)) {
for (var i in this.events[name]) {
if (this.events[name][i].callback.toString() === callback.toString()) {
return true;
}
}
}
return false;
},
/**
* Unbind event listener
*
* @param {String} name - event name
*/
off: function(name)
{
delete this.events[name];
},
/**
* Bind event listener
*
* @param {String} name - event name
* @param {Function} callback - registered function
* @param {Object} context - registered object
*/
on: function(name, callback, context)
{
if (!this.hasEvent(name)) {
this.events[name] = [];
}
if (!this.isRegistered(name, callback, context)) {
this.events[name].push({
callback: callback,
context : context
});
}
},
/**
* Triggers registered event.
* If event is not registered do nothing.
*
* @param {String} name - event name
* @param {mixed} args - custom messages passed to subscriber
*/
trigger: function(name, args)
{
if (this.hasEvent(name)) {
for (var i in this.events[name]) {
this.triggerOne(this.events[name][i], args);
}
}
},
//TODO: this needs refactoring!
triggerOne: function(event, args)
{
event.context === undefined ?
event.callback(args) :
event.callback.apply(event.context, [args]);
}
};
/**
* Singleton instance
*/
Evento.instance = null;
/**
* Singleton initiation
*/
Evento.getInstance = function() {
if (this.instance === null) {
this.instance = new Evento();
}
return this.instance;
};
if ((typeof module != 'undefined') && (module.exports)) { // Node Module
module.exports = Evento.getInstance();
} else if (typeof define != 'undefined' && define.hasOwnProperty('amd') && define.amd) { // RequireJS AMD
define(function(){
return Evento.getInstance();
});
} else if (typeof window != 'undefined') { // Fall back to attaching to window
window.Evento = Evento.getInstance();
};
}.call(this));