append host element, not contents, when component is nested

pull/811/head
Rich Harris 8 years ago
parent 71bd8e3008
commit 118988c16b

@ -142,7 +142,7 @@ export default function dom(
? `@proto ` ? `@proto `
: deindent` : deindent`
{ {
${['destroy', 'get', 'fire', 'observe', 'on', 'set', '_set', 'teardown'] ${['destroy', 'get', 'fire', 'observe', 'on', 'set', 'teardown', '_set', '_mount', '_unmount']
.map(n => `${n}: @${n === 'teardown' ? 'destroy' : n}`) .map(n => `${n}: @${n === 'teardown' ? 'destroy' : n}`)
.join(',\n')} .join(',\n')}
}`; }`;
@ -222,17 +222,15 @@ export default function dom(
this._fragment.create(); this._fragment.create();
`} `}
this._fragment.${block.hasIntroMethod ? 'intro' : 'mount'}( ${target}, ${anchor} ); this._fragment.${block.hasIntroMethod ? 'intro' : 'mount'}( ${target}, ${anchor} );
}
${(generator.hasComponents || generator.hasComplexBindings || templateProperties.oncreate || generator.hasIntroTransitions) && deindent` ${(generator.hasComponents || generator.hasComplexBindings || templateProperties.oncreate || generator.hasIntroTransitions) && deindent`
if ( !options._root ) {
${generator.hasComponents && `this._lock = true;`} ${generator.hasComponents && `this._lock = true;`}
${(generator.hasComponents || generator.hasComplexBindings) && `@callAll(this._beforecreate);`} ${(generator.hasComponents || generator.hasComplexBindings) && `@callAll(this._beforecreate);`}
${(generator.hasComponents || templateProperties.oncreate) && `@callAll(this._oncreate);`} ${(generator.hasComponents || templateProperties.oncreate) && `@callAll(this._oncreate);`}
${(generator.hasComponents || generator.hasIntroTransitions) && `@callAll(this._aftercreate);`} ${(generator.hasComponents || generator.hasIntroTransitions) && `@callAll(this._aftercreate);`}
${generator.hasComponents && `this._lock = false;`} ${generator.hasComponents && `this._lock = false;`}
}
`} `}
}
`; `;
if (generator.customElement) { if (generator.customElement) {
@ -265,19 +263,29 @@ export default function dom(
} }
customElements.define('${generator.tag}', ${name}); customElements.define('${generator.tag}', ${name});
@assign( ${prototypeBase}, ${proto}, {
_mount(target, anchor) {
this._fragment.mount(this.shadowRoot, null);
target.insertBefore(this, anchor);
},
_unmount() {
this.parentNode.removeChild(this);
}
});
`); `);
} else { } else {
builder.addBlock(deindent` builder.addBlock(deindent`
function ${name} ( options ) { function ${name} ( options ) {
${constructorBody} ${constructorBody}
} }
@assign( ${prototypeBase}, ${proto});
`); `);
} }
// TODO deprecate component.teardown() // TODO deprecate component.teardown()
builder.addBlock(deindent` builder.addBlock(deindent`
@assign( ${prototypeBase}, ${proto});
${options.dev && deindent` ${options.dev && deindent`
${name}.prototype._checkReadOnly = function _checkReadOnly ( newState ) { ${name}.prototype._checkReadOnly = function _checkReadOnly ( newState ) {
${Array.from(generator.readonly).map( ${Array.from(generator.readonly).map(

@ -466,8 +466,7 @@ export default function preprocess(
const state: State = { const state: State = {
namespace, namespace,
parentNode: null, parentNode: null,
parentNodes: 'nodes', parentNodes: 'nodes'
isTopLevel: true,
}; };
generator.blocks.push(block); generator.blocks.push(block);

@ -234,10 +234,10 @@ export default function visitComponent(
); );
block.builders.mount.addLine( block.builders.mount.addLine(
`${name}._fragment.mount( ${state.parentNode || '#target'}, ${state.parentNode ? 'null' : 'anchor'} );` `${name}._mount( ${state.parentNode || '#target'}, ${state.parentNode ? 'null' : 'anchor'} );`
); );
if (!state.parentNode) block.builders.unmount.addLine(`${name}._fragment.unmount();`); if (!state.parentNode) block.builders.unmount.addLine(`${name}._unmount();`);
block.builders.destroy.addLine(`${name}.destroy( false );`); block.builders.destroy.addLine(`${name}.destroy( false );`);

@ -163,6 +163,14 @@ export function callAll(fns) {
while (fns && fns.length) fns.pop()(); while (fns && fns.length) fns.pop()();
} }
export function _mount(target, anchor) {
this._fragment.mount(target, anchor);
}
export function _unmount() {
this._fragment.unmount();
}
export var proto = { export var proto = {
destroy: destroy, destroy: destroy,
get: get, get: get,
@ -172,7 +180,9 @@ export var proto = {
set: set, set: set,
teardown: destroy, teardown: destroy,
_recompute: noop, _recompute: noop,
_set: _set _set: _set,
_mount: _mount,
_unmount: _unmount
}; };
export var protoDev = { export var protoDev = {
@ -184,5 +194,7 @@ export var protoDev = {
set: set, set: set,
teardown: destroyDev, teardown: destroyDev,
_recompute: noop, _recompute: noop,
_set: _setDev _set: _setDev,
_mount: _mount,
_unmount: _unmount
}; };

Loading…
Cancel
Save