diff --git a/compiler/generate/index.js b/compiler/generate/index.js index 0ed0ed65da..f69191147b 100644 --- a/compiler/generate/index.js +++ b/compiler/generate/index.js @@ -57,6 +57,19 @@ export default function generate ( parsed, source, options ) { fragment.initStatements.push( `${fragment.autofocus}.focus();` ); } + const detachStatements = fragment.detachStatements.join( '\n\n' ); + const teardownStatements = fragment.teardownStatements.join( '\n\n' ); + + const detachBlock = deindent` + if ( detach ) { + ${detachStatements} + } + `; + + const teardownBlock = deindent` + ${teardownStatements}${detachStatements ? `\n\n${detachBlock}` : ``} + `; + renderers.push( deindent` function ${fragment.name} ( ${fragment.params}, component ) { ${fragment.initStatements.join( '\n\n' )} @@ -71,11 +84,7 @@ export default function generate ( parsed, source, options ) { }, teardown: function ( detach ) { - ${fragment.teardownStatements.join( '\n\n' )} - - if ( detach ) { - ${fragment.detachStatements.join( '\n\n' )} - } + ${teardownBlock} } }; } diff --git a/compiler/generate/visitors/Component.js b/compiler/generate/visitors/Component.js index 876ecadb03..7fcb427b41 100644 --- a/compiler/generate/visitors/Component.js +++ b/compiler/generate/visitors/Component.js @@ -17,6 +17,7 @@ export default { init: [], mount: [], update: [], + detach: [], teardown: [] }; @@ -44,6 +45,7 @@ export default { initStatements: [], mountStatements: [], updateStatements: [], + detachStatements: [], teardownStatements: [], counter: counter() @@ -123,6 +125,7 @@ export default { generator.current.initStatements.push( local.init.join( '\n' ) ); if ( local.update.length ) generator.current.updateStatements.push( local.update.join( '\n' ) ); if ( local.mount.length ) generator.current.mountStatements.push( local.mount.join( '\n' ) ); + if ( local.detach.length ) generator.current.detachStatements.push( local.detach.join( '\n' ) ); generator.current.teardownStatements.push( local.teardown.join( '\n' ) ); generator.push({ diff --git a/compiler/generate/visitors/Element.js b/compiler/generate/visitors/Element.js index b5b8b9e7ad..69614e721f 100644 --- a/compiler/generate/visitors/Element.js +++ b/compiler/generate/visitors/Element.js @@ -69,7 +69,7 @@ export default { local.init.unshift( render ); if ( isToplevel ) { - local.teardown.push( `if ( detach ) ${name}.parentNode.removeChild( ${name} );` ); + local.detach.push( `${name}.parentNode.removeChild( ${name} );` ); } // special case – bound