diff --git a/src/ng/rootScope.js b/src/ng/rootScope.js index 02a2cf66..c4614881 100644 --- a/src/ng/rootScope.js +++ b/src/ng/rootScope.js @@ -1103,8 +1103,11 @@ function $RootScopeProvider(){ var self = this; return function() { - namedListeners[namedListeners.indexOf(listener)] = null; - decrementListenerCount(self, 1, name); + var indexOfListener = namedListeners.indexOf(listener); + if (indexOfListener !== -1) { + namedListeners[indexOfListener] = null; + decrementListenerCount(self, 1, name); + } }; }, diff --git a/test/ng/rootScopeSpec.js b/test/ng/rootScopeSpec.js index 4928bf1e..2867db9c 100644 --- a/test/ng/rootScopeSpec.js +++ b/test/ng/rootScopeSpec.js @@ -1638,6 +1638,31 @@ describe('Scope', function() { expect(child1.$$listenerCount).toEqual({event1: 1}); expect(child2.$$listenerCount).toEqual({}); })); + + + it('should not decrement $$listenerCount when called second time', inject(function($rootScope) { + var child = $rootScope.$new(), + listener1Spy = jasmine.createSpy(), + listener2Spy = jasmine.createSpy(); + + child.$on('abc', listener1Spy); + expect($rootScope.$$listenerCount).toEqual({abc: 1}); + expect(child.$$listenerCount).toEqual({abc: 1}); + + var deregisterEventListener = child.$on('abc', listener2Spy); + expect($rootScope.$$listenerCount).toEqual({abc: 2}); + expect(child.$$listenerCount).toEqual({abc: 2}); + + deregisterEventListener(); + + expect($rootScope.$$listenerCount).toEqual({abc: 1}); + expect(child.$$listenerCount).toEqual({abc: 1}); + + deregisterEventListener(); + + expect($rootScope.$$listenerCount).toEqual({abc: 1}); + expect(child.$$listenerCount).toEqual({abc: 1}); + })); }); });