diff options
| -rw-r--r-- | src/ng/compile.js | 9 | ||||
| -rwxr-xr-x | test/ng/compileSpec.js | 60 | 
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">'); | 
