diff options
| -rw-r--r-- | src/Angular.js | 39 | ||||
| -rw-r--r-- | test/service/scopeSpec.js | 16 |
2 files changed, 37 insertions, 18 deletions
diff --git a/src/Angular.js b/src/Angular.js index 3f272ec2..17ede3aa 100644 --- a/src/Angular.js +++ b/src/Angular.js @@ -655,28 +655,31 @@ function equals(o1, o2) { if (o1 === null || o2 === null) return false; if (o1 !== o1 && o2 !== o2) return true; // NaN === NaN var t1 = typeof o1, t2 = typeof o2, length, key, keySet; - if (t1 == t2 && t1 == 'object') { - if (isArray(o1)) { - if ((length = o1.length) == o2.length) { - for(key=0; key<length; key++) { - if (!equals(o1[key], o2[key])) return false; + if (t1 == t2) { + if (t1 == 'object') { + if (isArray(o1)) { + if ((length = o1.length) == o2.length) { + for(key=0; key<length; key++) { + if (!equals(o1[key], o2[key])) return false; + } + return true; } - return true; - } - } else { - if (isScope(o1) || isScope(o2) || isWindow(o1) || isWindow(o2)) return false; - keySet = {}; - for(key in o1) { - if (key.charAt(0) !== '$' && !isFunction(o1[key]) && !equals(o1[key], o2[key])) { - return false; + } else { + if (isScope(o1) || isScope(o2) || isWindow(o1) || isWindow(o2)) return false; + keySet = {}; + for(key in o1) { + if (key.charAt(0) !== '$' && !isFunction(o1[key]) && !equals(o1[key], o2[key])) { + return false; + } + keySet[key] = true; } - keySet[key] = true; - } - for(key in o2) { - if (!keySet[key] && key.charAt(0) !== '$' && !isFunction(o2[key])) return false; + for(key in o2) { + if (!keySet[key] && key.charAt(0) !== '$' && !isFunction(o2[key])) return false; + } + return true; } - return true; } + if (t1 == 'function' && o1.$unboundFn) return o1.$unboundFn === o2.$unboundFn; } return false; } diff --git a/test/service/scopeSpec.js b/test/service/scopeSpec.js index 30805684..b1b870f4 100644 --- a/test/service/scopeSpec.js +++ b/test/service/scopeSpec.js @@ -248,6 +248,22 @@ describe('Scope', function() { })); + it('should watch functions', function() { + module(provideLog); + inject(function($rootScope, log) { + $rootScope.fn = function() {return 'a'}; + $rootScope.$watch('fn', function(scope, fn) { + log(fn()); + }); + $rootScope.$digest(); + expect(log).toEqual('a'); + $rootScope.fn = function() {return 'b'}; + $rootScope.$digest(); + expect(log).toEqual('a; b'); + }) + }); + + it('should prevent $digest recursion', inject(function($rootScope) { var callCount = 0; $rootScope.$watch('name', function() { |
