From a875b0bc7255d74b1758809dcc8a8f4fff1de81c Mon Sep 17 00:00:00 2001 From: Vojta Jina Date: Thu, 13 Sep 2012 02:40:00 -0700 Subject: [PATCH] fix($compile): reference local in isolate scope This was really corner case: Watcher needs to return changed value, to notify that model might have changed and one more $digest cycle needs to be performed. The watcher, that takes care of reference binding into an isolate scope ("="), did not return changed value, if the change was from the isolate scope to the parent. If any other watcher returned change, it worked fine, as this change caused re-digest. Closes #1272 --- src/ng/compile.js | 2 +- test/ng/compileSpec.js | 19 +++++++++++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/src/ng/compile.js b/src/ng/compile.js index ccdd1880613e..3fa4691ccbe4 100644 --- a/src/ng/compile.js +++ b/src/ng/compile.js @@ -747,7 +747,7 @@ function $CompileProvider($provide) { lastValue = scope[scopeName] = parentValue; } else { // if the parent can be assigned then do so - parentSet(parentScope, lastValue = scope[scopeName]); + parentSet(parentScope, parentValue = lastValue = scope[scopeName]); } } return parentValue; diff --git a/test/ng/compileSpec.js b/test/ng/compileSpec.js index 3d6144aceb45..b5e4c4507504 100644 --- a/test/ng/compileSpec.js +++ b/test/ng/compileSpec.js @@ -1709,6 +1709,7 @@ describe('$compile', function() { attrAlias: '@attr', ref: '=', refAlias: '= ref', + reference: '=', expr: '&', exprAlias: '&expr' }, @@ -1830,6 +1831,24 @@ describe('$compile', function() { $rootScope.$apply(); expect(componentScope.ref).toBe('hello misko'); })); + + // regression + it('should stabilize model', inject(function() { + compile('
'); + + var lastRefValueInParent; + $rootScope.$watch('name', function(ref) { + lastRefValueInParent = ref; + }); + + $rootScope.name = 'aaa'; + $rootScope.$apply(); + + componentScope.reference = 'new'; + $rootScope.$apply(); + + expect(lastRefValueInParent).toBe('new'); + })); });