Skip to content

Instantly share code, notes, and snippets.

@ChetHarrison
Created July 24, 2014 22:53
Show Gist options
  • Save ChetHarrison/9550dd615dfdf9f65b48 to your computer and use it in GitHub Desktop.
Save ChetHarrison/9550dd615dfdf9f65b48 to your computer and use it in GitHub Desktop.
rxjs Observable.fromEvent suport for Marionette
// 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