From d74ef497defa77c92873b09b7b6f4e19ae175779 Mon Sep 17 00:00:00 2001
From: Misko Hevery
Date: Sat, 23 Oct 2010 13:42:11 -0700
Subject: 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.
---
regression/filter_repeater.html | 1 -
regression/ng_include_this.html | 9 +++++++++
regression/ng_include_this.partial | 1 +
src/widgets.js | 10 +++++++++-
test/widgetsSpec.js | 11 +++++++++++
5 files changed, 30 insertions(+), 2 deletions(-)
create mode 100644 regression/ng_include_this.html
create mode 100644 regression/ng_include_this.partial
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() {
--
cgit v1.2.3