diff --git a/regression/filter_repeater.html b/regression/filter_repeater.html index 202a6311..4160fc6a 100644 --- a/regression/filter_repeater.html +++ b/regression/filter_repeater.html @@ -2,7 +2,6 @@ -

This is a demo of a potential bug in angular.

diff --git a/regression/ng_include_this.html b/regression/ng_include_this.html new file mode 100644 index 00000000..3138ed07 --- /dev/null +++ b/regression/ng_include_this.html @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/regression/ng_include_this.partial b/regression/ng_include_this.partial new file mode 100644 index 00000000..a4673196 --- /dev/null +++ b/regression/ng_include_this.partial @@ -0,0 +1 @@ +included HTML. eval count: {{c=c+1}} \ No newline at end of file diff --git a/src/widgets.js b/src/widgets.js index 877f4a72..34cc258a 100644 --- a/src/widgets.js +++ b/src/widgets.js @@ -256,11 +256,19 @@ angularWidget('ng:include', function(element){ return extend(function(xhr, element){ var scope = this, childScope; var changeCounter = 0; + var preventRecursion = false; function incrementChange(){ changeCounter++;} this.$watch(srcExp, incrementChange); this.$watch(scopeExp, incrementChange); scope.$onEval(function(){ - if (childScope) childScope.$eval(); + if (childScope && !preventRecursion) { + preventRecursion = true; + try { + childScope.$eval(); + } finally { + preventRecursion = false; + } + } }); this.$watch(function(){return changeCounter;}, function(){ var src = this.$eval(srcExp), diff --git a/test/widgetsSpec.js b/test/widgetsSpec.js index df0941c0..2d1aef1a 100644 --- a/test/widgetsSpec.js +++ b/test/widgetsSpec.js @@ -497,6 +497,17 @@ describe("widget", function(){ expect(element.text()).toEqual(''); }); + + it('should allow this for scope', function(){ + var element = jqLite(''); + var scope = angular.compile(element); + scope.url = 'myUrl'; + scope.$inject('$xhr.cache').data.myUrl = {value:'{{c=c+1}}'}; + scope.$init(); + // This should not be 4, but to fix this properly + // we need to have real events on the scopes. + expect(element.text()).toEqual('4'); + }); }); describe('a', function() {