diff --git a/src/ng/rootScope.js b/src/ng/rootScope.js index 29295f76a..7b615cf46 100644 --- a/src/ng/rootScope.js +++ b/src/ng/rootScope.js @@ -979,8 +979,11 @@ function $RootScopeProvider(){ var self = this; return function() { - namedListeners[indexOf(namedListeners, listener)] = null; - decrementListenerCount(self, 1, name); + var indexOfListener = indexOf(namedListeners, listener); + if (indexOfListener !== -1) { + namedListeners[indexOfListener] = null; + decrementListenerCount(self, 1, name); + } }; }, diff --git a/test/ng/rootScopeSpec.js b/test/ng/rootScopeSpec.js index cd86c71d3..7182bc07d 100644 --- a/test/ng/rootScopeSpec.js +++ b/test/ng/rootScopeSpec.js @@ -1361,6 +1361,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}); + })); }); });