Skip to content

Commit 61c7357

Browse files
committed
fix(renderer): handle empty fragments correctly
Closes angular#3100
1 parent 116b64d commit 61c7357

File tree

2 files changed

+32
-3
lines changed

2 files changed

+32
-3
lines changed

modules/angular2/src/render/dom/dom_renderer.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -83,8 +83,10 @@ export class DomRenderer extends Renderer {
8383
attachFragmentAfterFragment(previousFragmentRef: RenderFragmentRef,
8484
fragmentRef: RenderFragmentRef) {
8585
var previousFragmentNodes = resolveInternalDomFragment(previousFragmentRef);
86-
var sibling = previousFragmentNodes[previousFragmentNodes.length - 1];
87-
moveNodesAfterSibling(sibling, resolveInternalDomFragment(fragmentRef));
86+
if (previousFragmentNodes.length > 0) {
87+
var sibling = previousFragmentNodes[previousFragmentNodes.length - 1];
88+
moveNodesAfterSibling(sibling, resolveInternalDomFragment(fragmentRef));
89+
}
8890
}
8991

9092
attachFragmentAfterElement(elementRef: RenderElementRef, fragmentRef: RenderFragmentRef) {
@@ -253,7 +255,7 @@ export class DomRenderer extends Renderer {
253255
}
254256

255257
function moveNodesAfterSibling(sibling, nodes) {
256-
if (isPresent(DOM.parentElement(sibling))) {
258+
if (nodes.length > 0 && isPresent(DOM.parentElement(sibling))) {
257259
for (var i = 0; i < nodes.length; i++) {
258260
DOM.insertBefore(sibling, nodes[i]);
259261
}

modules/angular2/test/render/dom/dom_renderer_integration_spec.ts

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -197,6 +197,33 @@ export function main() {
197197
});
198198
}));
199199

200+
it('should add and remove empty fragments',
201+
inject([AsyncTestCompleter, DomTestbed], (async, tb: DomTestbed) => {
202+
tb.compileAndMerge(someComponent,
203+
[
204+
new ViewDefinition({
205+
componentId: 'someComponent',
206+
template: '<template></template><template></template>',
207+
directives: []
208+
})
209+
])
210+
.then((protoViewMergeMappings) => {
211+
var rootView = tb.createView(protoViewMergeMappings[0]);
212+
213+
var elr = elRef(rootView.viewRef, 1);
214+
expect(rootView.hostElement).toHaveText('');
215+
var fragment = rootView.fragments[1];
216+
var fragment2 = rootView.fragments[2];
217+
tb.renderer.attachFragmentAfterElement(elr, fragment);
218+
tb.renderer.attachFragmentAfterFragment(fragment, fragment2);
219+
tb.renderer.detachFragment(fragment);
220+
tb.renderer.detachFragment(fragment2);
221+
expect(rootView.hostElement).toHaveText('');
222+
223+
async.done();
224+
});
225+
}));
226+
200227
it('should handle events', inject([AsyncTestCompleter, DomTestbed], (async, tb: DomTestbed) => {
201228
tb.compileAndMerge(someComponent,
202229
[

0 commit comments

Comments
 (0)