diff --git a/src/compile/nodes/shared/Expression.ts b/src/compile/nodes/shared/Expression.ts index 5e223cd53d..0d4dbd4960 100644 --- a/src/compile/nodes/shared/Expression.ts +++ b/src/compile/nodes/shared/Expression.ts @@ -240,7 +240,7 @@ export default class Expression { dependencies.add(name); component.template_references.add(name); } - } else if (!is_synthetic && !component.hoistable_names.has(name) && !component.imported_declarations.has(name)) { + } else if (!is_synthetic && !(component.hoistable_names.has(name) && template_scope.isTopLevel(name)) && !component.imported_declarations.has(name)) { code.prependRight(node.start, key === 'key' && parent.shorthand ? `${name}: ctx.` : 'ctx.'); diff --git a/src/compile/nodes/shared/TemplateScope.ts b/src/compile/nodes/shared/TemplateScope.ts index c9b81070b8..8d31e848e6 100644 --- a/src/compile/nodes/shared/TemplateScope.ts +++ b/src/compile/nodes/shared/TemplateScope.ts @@ -40,4 +40,8 @@ export default class TemplateScope { if (this.parent) return this.parent.containsMutable(names); else return false; } + + isTopLevel(name: string) { + return !this.parent || !this.names.has(name) && this.parent.isTopLevel(name); + } } \ No newline at end of file diff --git a/test/runtime/samples/each-block-scope-shadow/_config.js b/test/runtime/samples/each-block-scope-shadow/_config.js new file mode 100644 index 0000000000..8005bc93d5 --- /dev/null +++ b/test/runtime/samples/each-block-scope-shadow/_config.js @@ -0,0 +1,3 @@ +export default { + html: '(alpaca)(baboon)(capybara)' +}; diff --git a/test/runtime/samples/each-block-scope-shadow/main.html b/test/runtime/samples/each-block-scope-shadow/main.html new file mode 100644 index 0000000000..b6c256e14f --- /dev/null +++ b/test/runtime/samples/each-block-scope-shadow/main.html @@ -0,0 +1,8 @@ +{#each animals as animal} + ({animal}) +{/each} + + \ No newline at end of file