Skip to content

Instantly share code, notes, and snippets.

@davsket
Created March 25, 2014 16:47
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save davsket/ffe1ff2cf686534d4e9e to your computer and use it in GitHub Desktop.
Save davsket/ffe1ff2cf686534d4e9e to your computer and use it in GitHub Desktop.
/*global define*/
/**
* Simple Observable Patter
*/
define(function(){
function Observable(){}
Observable.prototype = {
/**
* Initializes the events
*/
_initEvents: function(){
if( this._events ) return
this._events = {
all: []
}
},
/**
* Adds an observer
* @param {String} evt event name
* @param {Function} callback calback function
* @param {Object} context the referenced this
* @return {Observable} this
*/
on: function(evt, callback, context){
evt = evt || 'all'
this._initEvents()
if(!this._events[ evt ])
this._events[ evt ] = []
this._events[ evt ].push({
cb: callback,
ctx: context
})
return this
},
/**
* Removes an observer (callback) from
* the specified event list
* @param {String} evt event name
* @param {Function} callback calback function
* @param {Object} context the referenced this
* @return {Observable} this
*/
off: function(evt, callback, context){
var callbacks, i, tuple
evt = evt || 'all'
this._initEvents()
callbacks = this._events[evt]
if( !callbacks ) return this
for( i = callbacks.length; i--; ){
tuple = callbacks[i]
if( tuple.cb == callback && tuple.ctx == context ){
callbacks.splice( i, 1 )
return this
}
}
return this
},
/**
* Fires the event. Callable with any numer of arguments,
* but first the event name
* @param {String} evt the event name
*/
trigger: function( evt ){
this._initEvents()
var callbacks = this._events[ evt ],
i, tuple
if( callbacks ) for( i = callbacks.length; i--; ){
try{
tuple = callbacks[i]
tuple.cb.apply( tuple.ctx, arguments )
}catch(e){
console.error( 'Error executing callback: ' +
'(' + tuple.cb.name + ')' +
e.message )
}
}
// Those subscribed to all events shall be notified
// allways
if( evt != 'all' ){
callbacks = this._events[ 'all' ]
for( i = callbacks.length; i--; ){
try{
tuple = callbacks[i]
tuple.cb.apply( tuple.ctx, arguments )
}catch(e){
console.error( 'Error executing callback: ' +
'(' + tuple.cb.name + ')' +
e.message )
}
}
}
return this
}
}
return Observable
})
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment