aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/ng/compile.js13
-rwxr-xr-xtest/ng/compileSpec.js39
2 files changed, 48 insertions, 4 deletions
diff --git a/src/ng/compile.js b/src/ng/compile.js
index 5fefdaaa..7513fc7e 100644
--- a/src/ng/compile.js
+++ b/src/ng/compile.js
@@ -1303,13 +1303,17 @@ function $CompileProvider($provide) {
if (pre) {
if (attrStart) pre = groupElementsLinkFnWrapper(pre, attrStart, attrEnd);
pre.require = directive.require;
- if (newIsolateScopeDirective === directive || directive.$$isolateScope) pre.isolateScope = true;
+ if (newIsolateScopeDirective === directive || directive.$$isolateScope) {
+ pre = cloneAndAnnotateFn(pre, {isolateScope: true});
+ }
preLinkFns.push(pre);
}
if (post) {
if (attrStart) post = groupElementsLinkFnWrapper(post, attrStart, attrEnd);
post.require = directive.require;
- if (newIsolateScopeDirective === directive || directive.$$isolateScope) post.isolateScope = true;
+ if (newIsolateScopeDirective === directive || directive.$$isolateScope) {
+ post = cloneAndAnnotateFn(post, {isolateScope: true});
+ }
postLinkFns.push(post);
}
}
@@ -1830,6 +1834,11 @@ function $CompileProvider($provide) {
elementsToRemove[0] = newNode;
elementsToRemove.length = 1;
}
+
+
+ function cloneAndAnnotateFn(fn, annotation) {
+ return extend(function() { return fn.apply(null, arguments); }, fn, annotation);
+ }
}];
}
diff --git a/test/ng/compileSpec.js b/test/ng/compileSpec.js
index 356b1796..a61d50f2 100755
--- a/test/ng/compileSpec.js
+++ b/test/ng/compileSpec.js
@@ -2504,7 +2504,7 @@ describe('$compile', function() {
});
- it('should share isolate scope with replaced directives', function() {
+ it('should share isolate scope with replaced directives (template)', function() {
var normalScope;
var isolateScope;
@@ -2540,7 +2540,7 @@ describe('$compile', function() {
});
- it('should share isolate scope with replaced directives', function() {
+ it('should share isolate scope with replaced directives (templateUrl)', function() {
var normalScope;
var isolateScope;
@@ -2577,6 +2577,41 @@ describe('$compile', function() {
});
+ it('should not get confused about where to use isolate scope when a replaced directive is used multiple times',
+ function() {
+
+ module(function() {
+ directive('isolate', function() {
+ return {
+ replace: true,
+ scope: {},
+ template: '<span scope-tester="replaced"><span scope-tester="inside"></span></span>'
+ };
+ });
+ directive('scopeTester', function(log) {
+ return {
+ link: function($scope, $element) {
+ log($element.attr('scope-tester') + '=' + ($scope.$root === $scope ? 'non-isolate' : 'isolate'));
+ }
+ }
+ });
+ });
+
+ inject(function($compile, $rootScope, log) {
+ element = $compile('<div>' +
+ '<div isolate scope-tester="outside"></div>' +
+ '<span scope-tester="sibling"></span>' +
+ '</div>')($rootScope);
+
+ $rootScope.$digest();
+ expect(log).toEqual('inside=isolate; ' +
+ 'outside replaced=non-isolate; ' + // outside
+ 'outside replaced=isolate; ' + // replaced
+ 'sibling=non-isolate')
+ });
+ });
+
+
it('should require controller of a non-isolate directive from an isolate directive on the ' +
'same element', function() {
var NonIsolateController = function() {};