diff options
| -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() {  | 
