From e994259739821094e77a3d2c1f30c28713b7ab3a Mon Sep 17 00:00:00 2001 From: Igor Minar Date: Mon, 19 May 2014 14:57:03 -0700 Subject: [PATCH] revert: fix($compile): pass transcludeFn down to nested transclude directives This reverts commit 113850602de2f8bc396df4ffd54bb0f1be565b17. This change introduced regressions for several scenarios. reduction: http://jsfiddle.net/5242N/4/ --- src/ng/compile.js | 23 ++++++-------- test/ng/compileSpec.js | 72 ------------------------------------------ 2 files changed, 9 insertions(+), 86 deletions(-) diff --git a/src/ng/compile.js b/src/ng/compile.js index abe856122e81..1d0d901f1e07 100644 --- a/src/ng/compile.js +++ b/src/ng/compile.js @@ -941,7 +941,7 @@ function $CompileProvider($provide, $$sanitizeUriProvider) { return linkFnFound ? compositeLinkFn : null; function compositeLinkFn(scope, nodeList, $rootElement, boundTranscludeFn) { - var nodeLinkFn, childLinkFn, node, $node, childScope, i, ii, n; + var nodeLinkFn, childLinkFn, node, $node, childScope, childTranscludeFn, i, ii, n; // copy nodeList so that linking doesn't break due to live list updates. var nodeListLength = nodeList.length, @@ -963,17 +963,14 @@ function $CompileProvider($provide, $$sanitizeUriProvider) { } else { childScope = scope; } - - // We need to create a new boundTranscludeFn if - // - a directive on this element wants to transclude - // or - // - there is no boundTranscludeFn already and a transcludeFn was passed in - if ( nodeLinkFn.transcludeOnThisElement || (!boundTranscludeFn && transcludeFn) ) { - boundTranscludeFn = createBoundTranscludeFn(scope, nodeLinkFn.transclude || transcludeFn); + childTranscludeFn = nodeLinkFn.transclude; + if (childTranscludeFn || (!boundTranscludeFn && transcludeFn)) { + nodeLinkFn(childLinkFn, childScope, node, $rootElement, + createBoundTranscludeFn(scope, childTranscludeFn || transcludeFn) + ); + } else { + nodeLinkFn(childLinkFn, childScope, node, $rootElement, boundTranscludeFn); } - - nodeLinkFn(childLinkFn, childScope, node, $rootElement, boundTranscludeFn); - } else if (childLinkFn) { childLinkFn(scope, node.childNodes, undefined, boundTranscludeFn); } @@ -1349,9 +1346,7 @@ function $CompileProvider($provide, $$sanitizeUriProvider) { } nodeLinkFn.scope = newScopeDirective && newScopeDirective.scope === true; - nodeLinkFn.transcludeOnThisElement = hasTranscludeDirective; - nodeLinkFn.transclude = childTranscludeFn; - + nodeLinkFn.transclude = hasTranscludeDirective && childTranscludeFn; previousCompileContext.hasElementTranscludeDirective = hasElementTranscludeDirective; // might be normal or delayed nodeLinkFn depending on if templateUrl is present diff --git a/test/ng/compileSpec.js b/test/ng/compileSpec.js index df45976229fb..b3af196f3bb7 100755 --- a/test/ng/compileSpec.js +++ b/test/ng/compileSpec.js @@ -1497,78 +1497,6 @@ describe('$compile', function() { )); - describe('nested transcludes', function() { - - beforeEach(module(function($compileProvider) { - - $compileProvider.directive('noop', valueFn({})); - - $compileProvider.directive('sync', valueFn({ - template: '
', - transclude: true - })); - - $compileProvider.directive('async', valueFn({ - templateUrl: 'async', - transclude: true - })); - - $compileProvider.directive('syncSync', valueFn({ - template: '
', - transclude: true - })); - - $compileProvider.directive('syncAsync', valueFn({ - template: '
', - transclude: true - })); - - $compileProvider.directive('asyncSync', valueFn({ - templateUrl: 'asyncSync', - transclude: true - })); - - $compileProvider.directive('asyncAsync', valueFn({ - templateUrl: 'asyncAsync', - transclude: true - })); - - })); - - beforeEach(inject(function($templateCache) { - $templateCache.put('async', '
'); - $templateCache.put('asyncSync', '
'); - $templateCache.put('asyncAsync', '
'); - })); - - - it('should allow nested transclude directives with sync template containing sync template', inject(function($compile, $rootScope) { - element = $compile('
transcluded content
')($rootScope); - $rootScope.$digest(); - expect(trim(element.text())).toEqual('transcluded content'); - })); - - it('should allow nested transclude directives with sync template containing async template', inject(function($compile, $rootScope) { - element = $compile('
transcluded content
')($rootScope); - $rootScope.$digest(); - expect(trim(element.text())).toEqual('transcluded content'); - })); - - it('should allow nested transclude directives with async template containing sync template', inject(function($compile, $rootScope) { - element = $compile('
transcluded content
')($rootScope); - $rootScope.$digest(); - expect(trim(element.text())).toEqual('transcluded content'); - })); - - it('should allow nested transclude directives with async template containing asynch template', inject(function($compile, $rootScope) { - element = $compile('
transcluded content
')($rootScope); - $rootScope.$digest(); - expect(trim(element.text())).toEqual('transcluded content'); - })); - }); - - - it("should fail if replacing and template doesn't have a single root element", function() { module(function($exceptionHandlerProvider) { $exceptionHandlerProvider.mode('log');