From fce3f342fb47f0f3c31d6f61b6ed840f90c42347 Mon Sep 17 00:00:00 2001 From: Rich-Harris Date: Tue, 18 Apr 2017 22:21:15 -0400 Subject: [PATCH 1/2] allow dynamic each-block to have static else-block --- src/generators/dom/visitors/EachBlock.js | 32 +++++++++++++------ .../each-block-dynamic-else-static/_config.js | 29 +++++++++++++++++ .../each-block-dynamic-else-static/main.html | 5 +++ 3 files changed, 56 insertions(+), 10 deletions(-) create mode 100644 test/runtime/samples/each-block-dynamic-else-static/_config.js create mode 100644 test/runtime/samples/each-block-dynamic-else-static/main.html diff --git a/src/generators/dom/visitors/EachBlock.js b/src/generators/dom/visitors/EachBlock.js index 0454c4e6ba..6093aa8811 100644 --- a/src/generators/dom/visitors/EachBlock.js +++ b/src/generators/dom/visitors/EachBlock.js @@ -57,16 +57,28 @@ export default function visitEachBlock ( generator, block, state, node ) { } ` ); - block.builders.update.addBlock( deindent` - if ( !${each_block_value}.length && ${each_block_else} ) { - ${each_block_else}.update( changed, ${params} ); - } else if ( !${each_block_value}.length ) { - ${each_block_else} = ${node.else._block.name}( ${params}, ${block.component} ); - ${each_block_else}.mount( ${anchor}.parentNode, ${anchor} ); - } else if ( ${each_block_else} ) { - ${each_block_else}.destroy( true ); - } - ` ); + if ( node.else.hasUpdateMethod ) { + block.builders.update.addBlock( deindent` + if ( !${each_block_value}.length && ${each_block_else} ) { + ${each_block_else}.update( changed, ${params} ); + } else if ( !${each_block_value}.length ) { + ${each_block_else} = ${node.else._block.name}( ${params}, ${block.component} ); + ${each_block_else}.mount( ${anchor}.parentNode, ${anchor} ); + } else if ( ${each_block_else} ) { + ${each_block_else}.destroy( true ); + } + ` ); + } else { + block.builders.update.addBlock( deindent` + if ( ${each_block_value}.length ) { + if ( ${each_block_else} ) ${each_block_else}.destroy( true ); + } else if ( !${each_block_else} ) { + ${each_block_else} = ${node.else._block.name}( ${params}, ${block.component} ); + ${each_block_else}.mount( ${anchor}.parentNode, ${anchor} ); + } + ` ); + } + block.builders.destroy.addBlock( deindent` if ( ${each_block_else} ) { diff --git a/test/runtime/samples/each-block-dynamic-else-static/_config.js b/test/runtime/samples/each-block-dynamic-else-static/_config.js new file mode 100644 index 0000000000..c3074a7aa5 --- /dev/null +++ b/test/runtime/samples/each-block-dynamic-else-static/_config.js @@ -0,0 +1,29 @@ +export default { + solo: true, + + data: { + animals: [ 'alpaca', 'baboon', 'capybara' ] + }, + + html: ` +

alpaca

+

baboon

+

capybara

+ `, + + test ( assert, component, target ) { + component.set({ animals: [] }); + assert.htmlEqual( target.innerHTML, ` +

no animals

+ ` ); + + // trigger an 'update' of the else block, to ensure that + // non-existent update method is not called + component.set({ animals: [] }); + + component.set({ animals: ['wombat'] }); + assert.htmlEqual( target.innerHTML, ` +

wombat

+ ` ); + } +}; diff --git a/test/runtime/samples/each-block-dynamic-else-static/main.html b/test/runtime/samples/each-block-dynamic-else-static/main.html new file mode 100644 index 0000000000..edd88f4705 --- /dev/null +++ b/test/runtime/samples/each-block-dynamic-else-static/main.html @@ -0,0 +1,5 @@ +{{#each animals as animal}} +

{{animal}}

+{{else}} +

no animals

+{{/each}} \ No newline at end of file From 872e90474cfeb02326e4b742df69be71120cf3a3 Mon Sep 17 00:00:00 2001 From: Rich-Harris Date: Tue, 18 Apr 2017 22:26:33 -0400 Subject: [PATCH 2/2] whoops --- src/generators/dom/visitors/EachBlock.js | 2 +- test/runtime/samples/each-block-dynamic-else-static/_config.js | 2 -- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/src/generators/dom/visitors/EachBlock.js b/src/generators/dom/visitors/EachBlock.js index 6093aa8811..dbb1d2c085 100644 --- a/src/generators/dom/visitors/EachBlock.js +++ b/src/generators/dom/visitors/EachBlock.js @@ -57,7 +57,7 @@ export default function visitEachBlock ( generator, block, state, node ) { } ` ); - if ( node.else.hasUpdateMethod ) { + if ( node.else._block.hasUpdateMethod ) { block.builders.update.addBlock( deindent` if ( !${each_block_value}.length && ${each_block_else} ) { ${each_block_else}.update( changed, ${params} ); diff --git a/test/runtime/samples/each-block-dynamic-else-static/_config.js b/test/runtime/samples/each-block-dynamic-else-static/_config.js index c3074a7aa5..6508c6ba5e 100644 --- a/test/runtime/samples/each-block-dynamic-else-static/_config.js +++ b/test/runtime/samples/each-block-dynamic-else-static/_config.js @@ -1,6 +1,4 @@ export default { - solo: true, - data: { animals: [ 'alpaca', 'baboon', 'capybara' ] },