Created
July 24, 2014 22:53
-
-
Save ChetHarrison/9550dd615dfdf9f65b48 to your computer and use it in GitHub Desktop.
rxjs Observable.fromEvent suport for Marionette
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// Check for Angular/jQuery/Zepto support | |
var jq = | |
!!root.angular && !!angular.element ? angular.element : | |
(!!root.jQuery ? root.jQuery : ( | |
!!root.Zepto ? root.Zepto : null)); | |
// Check for ember | |
var ember = !!root.Ember && typeof root.Ember.addListener === 'function'; | |
// Check for Backbone.Marionette | |
// TODO: check for location of addListener as this will change with Radio | |
var marionette = !!root.Backbone.Marionette; | |
/** | |
* Creates an observable sequence by adding an event listener to the matching DOMElement or each item in the NodeList. | |
* | |
* @example | |
* var source = Rx.Observable.fromEvent(element, 'mouseup'); | |
* | |
* @param {Object} element The DOMElement or NodeList to attach a listener. | |
* @param {String} eventName The event name to attach the observable sequence. | |
* @param {Function} [selector] A selector which takes the arguments from the event handler to produce a single item to yield on next. | |
* @returns {Observable} An observable sequence of events from the specified element and the specified event. | |
*/ | |
Observable.fromEvent = function (element, eventName, selector) { | |
if (ember) { | |
return fromEventPattern( | |
function (h) { Ember.addListener(element, eventName, h); }, | |
function (h) { Ember.removeListener(element, eventName, h); }, | |
selector); | |
} | |
if (jq) { | |
var $elem = jq(element); | |
return fromEventPattern( | |
function (h) { $elem.on(eventName, h); }, | |
function (h) { $elem.off(eventName, h); }, | |
selector); | |
} | |
if (marionette) { | |
return fromEventPattern( | |
function (h) { Marionette.addListener(element, eventName, h); }, | |
function (h) { Marionette.removeListener(element, eventName, h); }, | |
selector); | |
} | |
return new AnonymousObservable(function (observer) { | |
return createEventListener( | |
element, | |
eventName, | |
function handler (e) { | |
var results = e; | |
if (selector) { | |
try { | |
results = selector(arguments); | |
} catch (err) { | |
observer.onError(err); | |
return | |
} | |
} | |
observer.onNext(results); | |
}); | |
}).publish().refCount(); | |
}; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment