diff options
| author | Igor Minar | 2012-11-30 01:16:08 +0100 |
|---|---|---|
| committer | Igor Minar | 2012-11-30 13:10:00 +0100 |
| commit | d6da505f4e044f8a487ac27a3ec707c11853ee0a (patch) | |
| tree | 039b8e1fd3cb1ba201d780d85e0a9ff985a35925 | |
| parent | 5f7054bf5d1189c9a7842bc6e6f97c003514fcd5 (diff) | |
| download | angular.js-d6da505f4e044f8a487ac27a3ec707c11853ee0a.tar.bz2 | |
fix(Scope): ensure that a scope is destroyed only once
Due to bd524fc4 calling $destroy() on a scope mupltiple times cases NPE.
Closes #1627
| -rw-r--r-- | src/ng/rootScope.js | 5 | ||||
| -rw-r--r-- | test/ng/rootScopeSpec.js | 16 |
2 files changed, 20 insertions, 1 deletions
diff --git a/src/ng/rootScope.js b/src/ng/rootScope.js index de4b7407..c99416f0 100644 --- a/src/ng/rootScope.js +++ b/src/ng/rootScope.js @@ -134,6 +134,7 @@ function $RootScopeProvider(){ this.$$nextSibling = this.$$prevSibling = this.$$childHead = this.$$childTail = null; this['this'] = this.$root = this; + this.$$destroyed = false; this.$$asyncQueue = []; this.$$listeners = {}; } @@ -467,10 +468,12 @@ function $RootScopeProvider(){ * perform any necessary cleanup. */ $destroy: function() { - if ($rootScope == this) return; // we can't remove the root node; + // we can't destroy the root scope or a scope that has been already destroyed + if ($rootScope == this || this.$$destroyed) return; var parent = this.$parent; this.$broadcast('$destroy'); + this.$$destroyed = true; if (parent.$$childHead == this) parent.$$childHead = this.$$nextSibling; if (parent.$$childTail == this) parent.$$childTail = this.$$prevSibling; diff --git a/test/ng/rootScopeSpec.js b/test/ng/rootScopeSpec.js index ee7fb796..55fc41b1 100644 --- a/test/ng/rootScopeSpec.js +++ b/test/ng/rootScopeSpec.js @@ -407,6 +407,22 @@ describe('Scope', function() { first.$destroy(); expect(log).toEqual('first; first-child'); })); + + + it('should $destroy a scope only once and ignore any further destroy calls', + inject(function($rootScope) { + $rootScope.$digest(); + expect(log).toBe('123'); + + first.$destroy(); + first.$apply(); + expect(log).toBe('12323'); + + first.$destroy(); + first.$destroy(); + first.$apply(); + expect(log).toBe('1232323'); + })); }); |
