From bf18fbf00fb01826d81192655faae87cc4437643 Mon Sep 17 00:00:00 2001 From: Arpad Borsos Date: Thu, 5 Jan 2017 20:47:29 +0100 Subject: [PATCH] Move EachBlock and RawMustache detach code into shared --- src/generators/dom/visitors/EachBlock.js | 12 ++++-------- src/generators/dom/visitors/RawMustacheTag.js | 9 ++------- src/shared/dom.js | 12 ++++++++++++ 3 files changed, 18 insertions(+), 15 deletions(-) diff --git a/src/generators/dom/visitors/EachBlock.js b/src/generators/dom/visitors/EachBlock.js index 6aebb15781..2799a421b8 100644 --- a/src/generators/dom/visitors/EachBlock.js +++ b/src/generators/dom/visitors/EachBlock.js @@ -132,9 +132,7 @@ export default { } } - for ( var ${i} = ${name}_value.length; ${i} < ${iterations}.length; ${i} += 1 ) { - ${iterations}[${i}].teardown( true ); - } + teardownEach( ${iterations}, true, ${name}_value.length ); ${iterations}.length = ${listName}.length; ` ); @@ -153,11 +151,9 @@ export default { ` ); } - generator.current.builders.teardown.addBlock( deindent` - for ( var ${i} = 0; ${i} < ${iterations}.length; ${i} += 1 ) { - ${iterations}[${i}].teardown( ${isToplevel ? 'detach' : 'false'} ); - } - ` ); + generator.uses.teardownEach = true; + generator.current.builders.teardown.addBlock( + `teardownEach( ${iterations}, ${isToplevel ? 'detach' : 'false'} );` ); if ( node.else ) { generator.current.builders.teardown.addBlock( deindent` diff --git a/src/generators/dom/visitors/RawMustacheTag.js b/src/generators/dom/visitors/RawMustacheTag.js index f257302185..e5e8f40c82 100644 --- a/src/generators/dom/visitors/RawMustacheTag.js +++ b/src/generators/dom/visitors/RawMustacheTag.js @@ -1,5 +1,3 @@ -import deindent from '../../../utils/deindent.js'; - export default { enter ( generator, node ) { const name = generator.current.getUniqueName( 'raw' ); @@ -20,11 +18,8 @@ export default { const isToplevel = generator.current.localElementDepth === 0; const mountStatement = `${before}.insertAdjacentHTML( 'afterend', ${snippet} );`; - const detachStatement = deindent` - while ( ${before}.nextSibling && ${before}.nextSibling !== ${after} ) { - ${before}.parentNode.removeChild( ${before}.nextSibling ); - } - `; + generator.uses.detachBetween = true; + const detachStatement = `detachBetween( ${before}, ${after} );`; if ( isToplevel ) { generator.current.builders.mount.addLine( mountStatement ); diff --git a/src/shared/dom.js b/src/shared/dom.js index 239f2d51e2..9d4231572f 100644 --- a/src/shared/dom.js +++ b/src/shared/dom.js @@ -10,6 +10,18 @@ export function detachNode ( node ) { node.parentNode.removeChild( node ); } +export function detachBetween ( before, after ) { + while ( before.nextSibling && before.nextSibling !== after ) { + before.parentNode.removeChild( before.nextSibling ); + } +} + +export function teardownEach ( iterations, detach, start ) { + for ( var i = ( start || 0 ); i < iterations.length; i += 1 ) { + iterations[i].teardown( detach ); + } +} + export function createElement ( name ) { return document.createElement( name ); }