From 0a7cbb33b06778833a4d99b1868cc07690a827a7 Mon Sep 17 00:00:00 2001 From: Tobias Bosch Date: Thu, 21 Nov 2013 21:54:42 -0800 Subject: fix(ngInclude): Don't throw when the ngInclude element contains content with directives. Related to #5069 --- src/ng/directive/ngInclude.js | 29 +++++++++++++++++------------ 1 file changed, 17 insertions(+), 12 deletions(-) (limited to 'src') diff --git a/src/ng/directive/ngInclude.js b/src/ng/directive/ngInclude.js index 7f395f96..b721aa23 100644 --- a/src/ng/directive/ngInclude.js +++ b/src/ng/directive/ngInclude.js @@ -188,18 +188,23 @@ var ngIncludeDirective = ['$http', '$templateCache', '$anchorScroll', '$compile' if (thisChangeId !== changeCounter) return; var newScope = scope.$new(); - $transclude(newScope, function(clone) { - cleanupLastIncludeContent(); - - currentScope = newScope; - currentElement = clone; - - currentElement.html(response); - $animate.enter(currentElement, null, $element, afterAnimation); - $compile(currentElement.contents())(currentScope); - currentScope.$emit('$includeContentLoaded'); - scope.$eval(onloadExp); - }); + // Note: This will also link all children of ng-include that were contained in the original + // html. If that content contains controllers, ... they could pollute/change the scope. + // However, using ng-include on an element with additional content does not make sense... + // Note: We can't remove them in the cloneAttchFn of $transclude as that + // function is called before linking the content, which would apply child + // directives to non existing elements. + var clone = $transclude(newScope, noop); + cleanupLastIncludeContent(); + + currentScope = newScope; + currentElement = clone; + + currentElement.html(response); + $animate.enter(currentElement, null, $element, afterAnimation); + $compile(currentElement.contents())(currentScope); + currentScope.$emit('$includeContentLoaded'); + scope.$eval(onloadExp); }).error(function() { if (thisChangeId === changeCounter) cleanupLastIncludeContent(); }); -- cgit v1.2.3