fix(renderer): handle empty fragments correctly

Closes #3100
This commit is contained in:
Tobias Bosch 2015-07-16 15:18:02 -07:00
parent 116b64de25
commit 61c73576c8
2 changed files with 32 additions and 3 deletions

View File

@ -83,9 +83,11 @@ export class DomRenderer extends Renderer {
attachFragmentAfterFragment(previousFragmentRef: RenderFragmentRef, attachFragmentAfterFragment(previousFragmentRef: RenderFragmentRef,
fragmentRef: RenderFragmentRef) { fragmentRef: RenderFragmentRef) {
var previousFragmentNodes = resolveInternalDomFragment(previousFragmentRef); var previousFragmentNodes = resolveInternalDomFragment(previousFragmentRef);
if (previousFragmentNodes.length > 0) {
var sibling = previousFragmentNodes[previousFragmentNodes.length - 1]; var sibling = previousFragmentNodes[previousFragmentNodes.length - 1];
moveNodesAfterSibling(sibling, resolveInternalDomFragment(fragmentRef)); moveNodesAfterSibling(sibling, resolveInternalDomFragment(fragmentRef));
} }
}
attachFragmentAfterElement(elementRef: RenderElementRef, fragmentRef: RenderFragmentRef) { attachFragmentAfterElement(elementRef: RenderElementRef, fragmentRef: RenderFragmentRef) {
if (isBlank(elementRef.renderBoundElementIndex)) { if (isBlank(elementRef.renderBoundElementIndex)) {
@ -253,7 +255,7 @@ export class DomRenderer extends Renderer {
} }
function moveNodesAfterSibling(sibling, nodes) { function moveNodesAfterSibling(sibling, nodes) {
if (isPresent(DOM.parentElement(sibling))) { if (nodes.length > 0 && isPresent(DOM.parentElement(sibling))) {
for (var i = 0; i < nodes.length; i++) { for (var i = 0; i < nodes.length; i++) {
DOM.insertBefore(sibling, nodes[i]); DOM.insertBefore(sibling, nodes[i]);
} }

View File

@ -197,6 +197,33 @@ export function main() {
}); });
})); }));
it('should add and remove empty fragments',
inject([AsyncTestCompleter, DomTestbed], (async, tb: DomTestbed) => {
tb.compileAndMerge(someComponent,
[
new ViewDefinition({
componentId: 'someComponent',
template: '<template></template><template></template>',
directives: []
})
])
.then((protoViewMergeMappings) => {
var rootView = tb.createView(protoViewMergeMappings[0]);
var elr = elRef(rootView.viewRef, 1);
expect(rootView.hostElement).toHaveText('');
var fragment = rootView.fragments[1];
var fragment2 = rootView.fragments[2];
tb.renderer.attachFragmentAfterElement(elr, fragment);
tb.renderer.attachFragmentAfterFragment(fragment, fragment2);
tb.renderer.detachFragment(fragment);
tb.renderer.detachFragment(fragment2);
expect(rootView.hostElement).toHaveText('');
async.done();
});
}));
it('should handle events', inject([AsyncTestCompleter, DomTestbed], (async, tb: DomTestbed) => { it('should handle events', inject([AsyncTestCompleter, DomTestbed], (async, tb: DomTestbed) => {
tb.compileAndMerge(someComponent, tb.compileAndMerge(someComponent,
[ [