From 28aa8f9d074135b0478badc4c0be691d9f983875 Mon Sep 17 00:00:00 2001 From: James Ward Date: Mon, 28 Jul 2014 15:52:44 +0100 Subject: [PATCH] carry over fix for backbone issue 2724 --- backbone-events-standalone.js | 26 ++++++++++++++++++++++---- backbone-events-standalone.min.js | 4 ++-- test.js | 14 ++++++++++++++ 3 files changed, 38 insertions(+), 6 deletions(-) diff --git a/backbone-events-standalone.js b/backbone-events-standalone.js index fd4c51f..9d76ba8 100644 --- a/backbone-events-standalone.js +++ b/backbone-events-standalone.js @@ -23,8 +23,10 @@ var root = this, breaker = {}, nativeForEach = Array.prototype.forEach, + nativeIsArray = Array.isArray, hasOwnProperty = Object.prototype.hasOwnProperty, slice = Array.prototype.slice, + toString = Object.prototype.toString, idCounter = 0; // Returns a partial implementation matching the minimal API subset required @@ -68,6 +70,21 @@ func = null; return memo; }; + }, + + isArray: nativeIsArray || function(obj) { + return toString.call(obj) == '[object Array]'; + }, + + isString: function(obj) { + return toString.call(obj) == '[object String]'; + }, + + isEmpty: function(obj) { + if (obj == null) return true; + if (_.isArray(obj) || _.isString(obj)) return obj.length === 0; + for (var key in obj) if (_.has(obj, key)) return false; + return true; } }; } @@ -166,11 +183,12 @@ var listeners = this._listeners; if (!listeners) return this; var deleteListener = !name && !callback; - if (typeof name === 'object') callback = this; + if (!callback && typeof name === 'object') callback = this; if (obj) (listeners = {})[obj._listenerId] = obj; for (var id in listeners) { - listeners[id].off(name, callback, this); - if (deleteListener) delete this._listeners[id]; + obj = listeners[id]; + obj.off(name, callback, this); + if (deleteListener || _.isEmpty(obj._events)) delete this._listeners[id]; } return this; } @@ -230,7 +248,7 @@ var listeners = this._listeners || (this._listeners = {}); var id = obj._listenerId || (obj._listenerId = _.uniqueId('l')); listeners[id] = obj; - if (typeof name === 'object') callback = this; + if (!callback && typeof name === 'object') callback = this; obj[implementation](name, callback, this); return this; }; diff --git a/backbone-events-standalone.min.js b/backbone-events-standalone.min.js index 90cdcd1..0e5cefd 100644 --- a/backbone-events-standalone.min.js +++ b/backbone-events-standalone.min.js @@ -1,2 +1,2 @@ -/*! backbone-events-standalone 0.1.5 2013-10-14 */ -!function(){function a(){return{keys:Object.keys,uniqueId:function(a){var b=++h+"";return a?a+b:b},has:function(a,b){return f.call(a,b)},each:function(a,b,c){if(null!=a)if(e&&a.forEach===e)a.forEach(b,c);else if(a.length===+a.length){for(var f=0,g=a.length;g>f;f++)if(b.call(c,a[f],f,a)===d)return}else for(var h in a)if(this.has(a,h)&&b.call(c,a[h],h,a)===d)return},once:function(a){var b,c=!1;return function(){return c?b:(c=!0,b=a.apply(this,arguments),a=null,b)}}}}var b,c=this,d={},e=Array.prototype.forEach,f=Object.prototype.hasOwnProperty,g=Array.prototype.slice,h=0,i=a();b={on:function(a,b,c){if(!k(this,"on",a,[b,c])||!b)return this;this._events||(this._events={});var d=this._events[a]||(this._events[a]=[]);return d.push({callback:b,context:c,ctx:c||this}),this},once:function(a,b,c){if(!k(this,"once",a,[b,c])||!b)return this;var d=this,e=i.once(function(){d.off(a,e),b.apply(this,arguments)});return e._callback=b,this.on(a,e,c)},off:function(a,b,c){var d,e,f,g,h,j,l,m;if(!this._events||!k(this,"off",a,[b,c]))return this;if(!a&&!b&&!c)return this._events={},this;for(g=a?[a]:i.keys(this._events),h=0,j=g.length;j>h;h++)if(a=g[h],f=this._events[a]){if(this._events[a]=d=[],b||c)for(l=0,m=f.length;m>l;l++)e=f[l],(b&&b!==e.callback&&b!==e.callback._callback||c&&c!==e.context)&&d.push(e);d.length||delete this._events[a]}return this},trigger:function(a){if(!this._events)return this;var b=g.call(arguments,1);if(!k(this,"trigger",a,b))return this;var c=this._events[a],d=this._events.all;return c&&l(c,b),d&&l(d,arguments),this},stopListening:function(a,b,c){var d=this._listeners;if(!d)return this;var e=!b&&!c;"object"==typeof b&&(c=this),a&&((d={})[a._listenerId]=a);for(var f in d)d[f].off(b,c,this),e&&delete this._listeners[f];return this}};var j=/\s+/,k=function(a,b,c,d){if(!c)return!0;if("object"==typeof c){for(var e in c)a[b].apply(a,[e,c[e]].concat(d));return!1}if(j.test(c)){for(var f=c.split(j),g=0,h=f.length;h>g;g++)a[b].apply(a,[f[g]].concat(d));return!1}return!0},l=function(a,b){var c,d=-1,e=a.length,f=b[0],g=b[1],h=b[2];switch(b.length){case 0:for(;++df;f++)if(b.call(c,a[f],f,a)===d)return}else for(var h in a)if(this.has(a,h)&&b.call(c,a[h],h,a)===d)return},once:function(a){var b,c=!1;return function(){return c?b:(c=!0,b=a.apply(this,arguments),a=null,b)}},isArray:f||function(a){return"[object Array]"==i.call(a)},isString:function(a){return"[object String]"==i.call(a)},isEmpty:function(a){if(null==a)return!0;if(k.isArray(a)||k.isString(a))return 0===a.length;for(var b in a)if(k.has(a,b))return!1;return!0}}}var b,c=this,d={},e=Array.prototype.forEach,f=Array.isArray,g=Object.prototype.hasOwnProperty,h=Array.prototype.slice,i=Object.prototype.toString,j=0,k=a();b={on:function(a,b,c){if(!m(this,"on",a,[b,c])||!b)return this;this._events||(this._events={});var d=this._events[a]||(this._events[a]=[]);return d.push({callback:b,context:c,ctx:c||this}),this},once:function(a,b,c){if(!m(this,"once",a,[b,c])||!b)return this;var d=this,e=k.once(function(){d.off(a,e),b.apply(this,arguments)});return e._callback=b,this.on(a,e,c)},off:function(a,b,c){var d,e,f,g,h,i,j,l;if(!this._events||!m(this,"off",a,[b,c]))return this;if(!a&&!b&&!c)return this._events={},this;for(g=a?[a]:k.keys(this._events),h=0,i=g.length;i>h;h++)if(a=g[h],f=this._events[a]){if(this._events[a]=d=[],b||c)for(j=0,l=f.length;l>j;j++)e=f[j],(b&&b!==e.callback&&b!==e.callback._callback||c&&c!==e.context)&&d.push(e);d.length||delete this._events[a]}return this},trigger:function(a){if(!this._events)return this;var b=h.call(arguments,1);if(!m(this,"trigger",a,b))return this;var c=this._events[a],d=this._events.all;return c&&n(c,b),d&&n(d,arguments),this},stopListening:function(a,b,c){var d=this._listeners;if(!d)return this;var e=!b&&!c;c||"object"!=typeof b||(c=this),a&&((d={})[a._listenerId]=a);for(var f in d)a=d[f],a.off(b,c,this),(e||k.isEmpty(a._events))&&delete this._listeners[f];return this}};var l=/\s+/,m=function(a,b,c,d){if(!c)return!0;if("object"==typeof c){for(var e in c)a[b].apply(a,[e,c[e]].concat(d));return!1}if(l.test(c)){for(var f=c.split(l),g=0,h=f.length;h>g;g++)a[b].apply(a,[f[g]].concat(d));return!1}return!0},n=function(a,b){var c,d=-1,e=a.length,f=b[0],g=b[1],h=b[2];switch(b.length){case 0:for(;++d