diff options
| author | Misko Hevery | 2010-10-23 13:42:11 -0700 |
|---|---|---|
| committer | Misko Hevery | 2010-10-23 13:42:11 -0700 |
| commit | d74ef497defa77c92873b09b7b6f4e19ae175779 (patch) | |
| tree | 377a3e264f9fc81bfd494fdd8f7c44c1cd36694d | |
| parent | 6ddcf918610c1dd094a964fc03e129a67f17dfaa (diff) | |
| download | angular.js-d74ef497defa77c92873b09b7b6f4e19ae175779.tar.bz2 | |
Fix for getting into recursive $eval on scope. Close #59
It sort of worked since the browser would throw stack too deep
exception and the angular would then print the error to console.
So as long as you did not have console open you would not notice
this as an error.
| -rw-r--r-- | regression/filter_repeater.html | 1 | ||||
| -rw-r--r-- | regression/ng_include_this.html | 9 | ||||
| -rw-r--r-- | regression/ng_include_this.partial | 1 | ||||
| -rw-r--r-- | src/widgets.js | 10 | ||||
| -rw-r--r-- | test/widgetsSpec.js | 11 |
5 files changed, 30 insertions, 2 deletions
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 @@ <html xmlns:ng="http://angularjs.org"> <head> <script type="text/javascript" src="../src/angular-bootstrap.js" ng:autobind></script> - </script> </head> <body ng:init="$window.$root = this; data = [{foo: 'foo'},{bar: 'bar'}]"> <p>This is a demo of a potential bug in angular.</p> 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 @@ +<!DOCTYPE HTML> +<html xmlns:ng="http://angularjs.org"> +<head> + <script type="text/javascript" src="../src/angular-bootstrap.js" ng:autobind></script> +</head> +<body ng:init="$window.$root = this; data = [{foo: 'foo'},{bar: 'bar'}]"> + <ng:include src="'ng_include_this.partial'" scope="this"/> +</body> +</html>
\ 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('<ng:include src="url" scope="this"></ng:include>'); + 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() { |
