diff options
| author | Daniel Luz | 2012-11-04 19:11:24 -0200 |
|---|---|---|
| committer | Misko Hevery | 2013-02-14 14:43:56 -0800 |
| commit | 1d7a95df565192fc02a18b0b297b39dd615eaeb5 (patch) | |
| tree | 9a307559c483251b40e500739ce96db85731712f | |
| parent | 1ed638582d2f2c7f89384d9712f4cfac52cc5b70 (diff) | |
| download | angular.js-1d7a95df565192fc02a18b0b297b39dd615eaeb5.tar.bz2 | |
feat(scope): only evaluate constant $watch expressions once
| -rw-r--r-- | src/ng/rootScope.js | 8 | ||||
| -rw-r--r-- | test/ng/rootScopeSpec.js | 14 |
2 files changed, 21 insertions, 1 deletions
diff --git a/src/ng/rootScope.js b/src/ng/rootScope.js index b6a582bc..866b957e 100644 --- a/src/ng/rootScope.js +++ b/src/ng/rootScope.js @@ -300,6 +300,14 @@ function $RootScopeProvider(){ watcher.fn = function(newVal, oldVal, scope) {listenFn(scope);}; } + if (typeof watchExp == 'string' && get.constant) { + var originalFn = watcher.fn; + watcher.fn = function(newVal, oldVal, scope) { + originalFn.call(this, newVal, oldVal, scope); + arrayRemove(array, watcher); + }; + } + if (!array) { array = scope.$$watchers = []; } diff --git a/test/ng/rootScopeSpec.js b/test/ng/rootScopeSpec.js index 49364888..33db814c 100644 --- a/test/ng/rootScopeSpec.js +++ b/test/ng/rootScopeSpec.js @@ -99,6 +99,14 @@ describe('Scope', function() { expect(spy).wasCalled(); })); + it('should not keep constant expressions on watch queue', inject(function($rootScope) { + $rootScope.$watch('1 + 1', function() {}); + expect($rootScope.$$watchers.length).toEqual(1); + $rootScope.$digest(); + + expect($rootScope.$$watchers.length).toEqual(0); + })); + it('should delegate exceptions', function() { module(function($exceptionHandlerProvider) { @@ -119,10 +127,14 @@ describe('Scope', function() { var log = ''; $rootScope.$watch('a', function() { log += 'a'; }); $rootScope.$watch('b', function() { log += 'b'; }); + // constant expressions have slightly different handling, + // let's ensure they are kept in the same list as others + $rootScope.$watch('1', function() { log += '1'; }); $rootScope.$watch('c', function() { log += 'c'; }); + $rootScope.$watch('2', function() { log += '2'; }); $rootScope.a = $rootScope.b = $rootScope.c = 1; $rootScope.$digest(); - expect(log).toEqual('abc'); + expect(log).toEqual('ab1c2'); })); |
