aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVojta Jina2013-11-05 12:27:56 -0800
committerIgor Minar2013-11-07 22:08:04 -0800
commitd0efd5eefcc0aaf167c766513e152b74dd31bafe (patch)
tree6afd4cd397adeba0392c2b0272f2feb26834f8c1
parent909cabd36d779598763cc358979ecd85bb40d4d7 (diff)
downloadangular.js-d0efd5eefcc0aaf167c766513e152b74dd31bafe.tar.bz2
fix($compile): only pass isolate scope to children that belong to the isolate directive
I had to fix one unit test, as it assumed the broken behavior, where application template gets the isolate scope of other (isolate) directive, rather than the regular scope. BREAKING CHANGE: Child elements that are defined either in the application template or in some other directives template do not get the isolate scope. In theory, nobody should rely on this behavior, as it is very rare - in most cases the isolate directive has a template.
-rw-r--r--src/ng/compile.js9
-rwxr-xr-xtest/ng/compileSpec.js60
2 files changed, 65 insertions, 4 deletions
diff --git a/src/ng/compile.js b/src/ng/compile.js
index adcbb6af..7616aa07 100644
--- a/src/ng/compile.js
+++ b/src/ng/compile.js
@@ -1480,8 +1480,13 @@ function $CompileProvider($provide) {
}
// RECURSION
- // TODO(vojta): only pass isolate if the isolate directive has template
- childLinkFn && childLinkFn(isolateScope || scope, linkNode.childNodes, undefined, boundTranscludeFn);
+ // We only pass the isolate scope, if the isolate directive has a template,
+ // otherwise the child elements do not belong to the isolate directive.
+ var scopeToChild = scope;
+ if (newIsolateScopeDirective && (newIsolateScopeDirective.template || newIsolateScopeDirective.templateUrl === null)) {
+ scopeToChild = isolateScope;
+ }
+ childLinkFn && childLinkFn(scopeToChild, linkNode.childNodes, undefined, boundTranscludeFn);
// POSTLINKING
for(i = postLinkFns.length - 1; i >= 0; i--) {
diff --git a/test/ng/compileSpec.js b/test/ng/compileSpec.js
index 09048885..2b6b235f 100755
--- a/test/ng/compileSpec.js
+++ b/test/ng/compileSpec.js
@@ -1426,7 +1426,7 @@ describe('$compile', function() {
return {
restrict: 'CA',
link: {pre: function(scope) {
- log('log-' + scope.$id + '-' + scope.$parent.$id);
+ log('log-' + scope.$id + '-' + (scope.$parent && scope.$parent.$id || 'no-parent'));
}}
};
});
@@ -1443,7 +1443,7 @@ describe('$compile', function() {
it('should allow creation of new isolated scopes for directives', inject(
function($rootScope, $compile, log) {
element = $compile('<div><span iscope><a log></a></span></div>')($rootScope);
- expect(log).toEqual('log-002-001; LOG; 002');
+ expect(log).toEqual('log-001-no-parent; LOG; 002');
$rootScope.name = 'abc';
expect(iscope.$parent).toBe($rootScope);
expect(iscope.name).toBeUndefined();
@@ -2131,6 +2131,62 @@ describe('$compile', function() {
expect(componentScope.$parent).toBe(regularScope)
}));
+ it('should not give the isolate scope to other directive template', function() {
+ module(function() {
+ directive('otherTplDir', function() {
+ return {
+ template: 'value: {{value}}'
+ };
+ });
+ });
+
+ inject(function($rootScope) {
+ compile('<div my-component other-tpl-dir>');
+
+ $rootScope.$apply(function() {
+ $rootScope.value = 'from-parent';
+ });
+
+ expect(element.html()).toBe('value: from-parent');
+ });
+ });
+
+
+ it('should not give the isolate scope to other directive template (with templateUrl)', function() {
+ module(function() {
+ directive('otherTplDir', function() {
+ return {
+ templateUrl: 'other.html'
+ };
+ });
+ });
+
+ inject(function($rootScope, $templateCache) {
+ $templateCache.put('other.html', 'value: {{value}}')
+ compile('<div my-component other-tpl-dir>');
+
+ $rootScope.$apply(function() {
+ $rootScope.value = 'from-parent';
+ });
+
+ expect(element.html()).toBe('value: from-parent');
+ });
+ });
+
+
+ it('should not give the isolate scope to regular child elements', function() {
+ inject(function($rootScope) {
+ compile('<div my-component>value: {{value}}</div>');
+
+ $rootScope.$apply(function() {
+ $rootScope.value = 'from-parent';
+ });
+
+ expect(element.html()).toBe('value: from-parent');
+ });
+ });
+
+
describe('attribute', function() {
it('should copy simple attribute', inject(function() {
compile('<div><span my-component attr="some text">');