aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/ng/rootScope.js8
-rw-r--r--test/ng/rootScopeSpec.js14
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');
}));