UNPKG

backbone-xhr-events

Version:

Backbone plugin giving you full featured XHR observer capabilities

4 lines 3.74 kB
/*! * https://github.com/jhudson8/backbone-xhr-events v1.0.1; MIT license; Joe Hudson<joehud_AT_gmail.com> */ !function(e){"function"==typeof define&&define.amd?define(["backbone","underscore"],function(t,r){return e(t,r)}):"undefined"!=typeof exports&&"undefined"!=typeof require?module.exports=e(require("backbone"),require("underscore")):e(Backbone,_)}(function(e,t){function r(e,t){var r=e._eventForwarders=e._eventForwarders||{};return r[t]||(r[t]={}),r[t]}function n(e,t,n){var i=r(t,n);e=e||"_all";var a=i[e];return a||(a=function(e){var t=e._forwardTo=e._forwardTo||[];t.push(o(e.method,n,e.options||{},!0))},i[e]=a),a}function o(e,t,r,n){function o(e){n||a||(a=!0,f.removeLoadEntry(),e=e||"halt",f.triggerAll("complete",e))}function i(e){function t(){if(!a)try{var t=Array.prototype.slice.call(arguments,0,3),r=p[e];r&&r.apply(f,t),t.splice(0,0,e),t.push(f),f.triggerAll.apply(f,t)}finally{o(e)}}f._handler[e]=t,r[e]=function(r,n,o){if(!f._defaultPrevented){if(f.triggerAll("after-send",r,n,o,e),f._defaultPrevented)return;f.data&&(r=f.data||r),t(r,n,o)}}}var a,c=r.event||e,f=new l(e,t,r),v=s+":"+c,p={success:r.success,error:r.error};if(f._handler.complete=o,n||(i(d),i(u)),t.trigger(s,f,c),t.trigger(v,f),!n){h.trigger(s,f,c),h.trigger(v,f);var g=r.beforeSend;r.beforeSend=function(e,t){if(f.xhr=e,f.xhrSettings=t,g){var r=g.call(this,e,t);if(r===!1)return r}return f.triggerAll("before-send",e,t),f._defaultPrevented?!1:void f.pushLoadActivity()}}return f}var i=e.xhrCompleteEventName=e.xhrCompleteEventName||"xhr:complete",a=e.xhrModelLoadingAttribute=e.xhrModelLoadingAttribute||"xhrActivity",s=e.xhrEventName=e.xhrEventName||"xhr",c=e.xhrGlobalAttribute=e.xhrGlobalAttribute||"xhrEvents",h=e[c]=t.extend({},e.Events),d="success",u="error",l=function(e,t,r){this.method=e,this.model=t,this.options=r,this._handler={}};t.extend(l.prototype,{abort:function(){this.aborted||(this.aborted=!0,this.type="abort",this.triggerAll("abort"),this.xhr&&this.xhr.abort())},preventDefault:function(){return this._defaultPrevented=!0,this._handler},triggerAll:function(){var e=t.toArray(arguments);e.push(this),this.trigger.apply(this,e),t.each(this._forwardTo,function(t){e.splice(e.length-1,1,t),t.triggerAll.apply(t,e)})},pushLoadActivity:function(){var e=this.model,r=e[a]=e[a]||[];r.push(this),t.each(this._forwardTo,function(e){e.pushLoadActivity()})},removeLoadEntry:function(){function e(e){var t=e.model,r=t[a]||[],n=r.indexOf(e);n>=0&&r.splice(n,1),0===r.length&&(t[a]=void 0,t.trigger(i,e))}e(this),t.each(this._forwardTo,e)}},e.Events);var f=e.sync;e.sync=function(e,t,r){r=r||{};var n=o(e,t,r);if(!n._defaultPrevented){var i=f.call(this,e,t,r);return n.xhr=i,i}},h.on(s+":read",function(e){var t=e.model;e.on(d,function(){t.hasBeenFetched=!0,t.hadFetchError=!1}),e.on(u,function(){t.hadFetchError=!0})}),e.Model.prototype.ensureFetched=e.Collection.prototype.ensureFetched=function(e,r){function n(){e&&e(o)}var o=this;if(this.hasBeenFetched)return n();var i=t.find(this[a],function(e){return"read"===e.method});i?(i.on("success",n),r&&i.on("error",r)):this.fetch({success:n,error:r})},e.forwardXHREvents=function(r,o,i){var a=n(!t.isFunction(i)&&i,r,o);if(t.isFunction(i))try{r.on(s,a,o),i.call(this)}finally{e.stopXHRForwarding(r,o)}else{var c=i?s+":"+i:s;r.on(c,a,o)}},e.stopXHRForwarding=function(e,n,o){o=o||"_all";var i=r(e,n),a=i[o];a&&(delete i[o],e.off(s,a,n));var c=0;t.each(i,function(){c++}),c||(delete e._eventForwarders[n],t.each(e._eventForwarders,function(){c++}),c||delete e._eventForwarders)},t.each({reset:e.Collection,clear:e.Model},function(e,r){var n=e.prototype[r];e.prototype[r]=function(e){("clear"===r||t.isUndefined(e))&&(this.hasBeenFetched=this.hadFetchError=!1),n.apply(this,arguments)}})});