diff --git a/src/ng/compile.js b/src/ng/compile.js index e8bd8ca01668..a257c0b5f096 100644 --- a/src/ng/compile.js +++ b/src/ng/compile.js @@ -2575,7 +2575,7 @@ function $CompileProvider($provide, $$sanitizeUriProvider) { // We have transclusion slots, // collect them up, compile them and store their transclusion functions - $template = []; + $template = window.document.createDocumentFragment(); var slotMap = createMap(); var filledSlots = createMap(); @@ -2603,10 +2603,10 @@ function $CompileProvider($provide, $$sanitizeUriProvider) { var slotName = slotMap[directiveNormalize(nodeName_(node))]; if (slotName) { filledSlots[slotName] = true; - slots[slotName] = slots[slotName] || []; - slots[slotName].push(node); + slots[slotName] = slots[slotName] || window.document.createDocumentFragment(); + slots[slotName].appendChild(node); } else { - $template.push(node); + $template.appendChild(node); } }); @@ -2620,9 +2620,11 @@ function $CompileProvider($provide, $$sanitizeUriProvider) { for (var slotName in slots) { if (slots[slotName]) { // Only define a transclusion function if the slot was filled - slots[slotName] = compilationGenerator(mightHaveMultipleTransclusionError, slots[slotName], transcludeFn); + slots[slotName] = compilationGenerator(mightHaveMultipleTransclusionError, slots[slotName].childNodes, transcludeFn); } } + + $template = $template.childNodes; } $compileNode.empty(); // clear contents diff --git a/test/ng/compileSpec.js b/test/ng/compileSpec.js index d24a90f9744c..a0b8b7204439 100644 --- a/test/ng/compileSpec.js +++ b/test/ng/compileSpec.js @@ -8843,6 +8843,50 @@ describe('$compile', function() { }); }); + + it('should correctly handle multi-element directives', function() { + module(function() { + directive('foo', valueFn({ + template: '[
]', + transclude: true + })); + directive('bar', valueFn({ + template: '[|]', + transclude: { + header: 'header', + footer: 'footer' + } + })); + }); + + inject(function($compile, $rootScope) { + var tmplWithFoo = + '