diff --git a/src/ng/compile.js b/src/ng/compile.js index 9311662add37..3eb8b000e86c 100644 --- a/src/ng/compile.js +++ b/src/ng/compile.js @@ -1771,7 +1771,6 @@ function $CompileProvider($provide, $$sanitizeUriProvider) { }); afterTemplateChildLinkFn = compileNodes($compileNode[0].childNodes, childTranscludeFn); - while(linkQueue.length) { var scope = linkQueue.shift(), beforeTemplateLinkNode = linkQueue.shift(), @@ -1808,13 +1807,17 @@ function $CompileProvider($provide, $$sanitizeUriProvider) { }); return function delayedNodeLinkFn(ignoreChildLinkFn, scope, node, rootElement, boundTranscludeFn) { + var childBoundTranscludeFn = boundTranscludeFn; if (linkQueue) { linkQueue.push(scope); linkQueue.push(node); linkQueue.push(rootElement); - linkQueue.push(boundTranscludeFn); + linkQueue.push(childBoundTranscludeFn); } else { - afterTemplateNodeLinkFn(afterTemplateChildLinkFn, scope, node, rootElement, boundTranscludeFn); + if (afterTemplateNodeLinkFn.transcludeOnThisElement) { + childBoundTranscludeFn = createBoundTranscludeFn(scope, afterTemplateNodeLinkFn.transclude, boundTranscludeFn); + } + afterTemplateNodeLinkFn(afterTemplateChildLinkFn, scope, node, rootElement, childBoundTranscludeFn); } }; } diff --git a/test/ng/compileSpec.js b/test/ng/compileSpec.js index 9c194b0bfc9b..7f43567a6173 100755 --- a/test/ng/compileSpec.js +++ b/test/ng/compileSpec.js @@ -4852,6 +4852,57 @@ describe('$compile', function() { expect(element.text()).toBe('-->|x|'); })); + + + // See https://github.com/angular/angular.js/issues/7183 + it("should pass transclusion through to template of a 'replace' directive", function() { + module(function() { + directive('transSync', function() { + return { + transclude: true, + link: function(scope, element, attr, ctrl, transclude) { + + expect(transclude).toEqual(jasmine.any(Function)); + + transclude(function(child) { element.append(child); }); + } + }; + }); + + directive('trans', function($timeout) { + return { + transclude: true, + link: function(scope, element, attrs, ctrl, transclude) { + + // We use timeout here to simulate how ng-if works + $timeout(function() { + transclude(function(child) { element.append(child); }); + }); + } + }; + }); + + directive('replaceWithTemplate', function() { + return { + templateUrl: "template.html", + replace: true + }; + }); + }); + + inject(function($compile, $rootScope, $templateCache, $timeout) { + + $templateCache.put('template.html', '