diff --git a/src/compiler/compile/render_dom/Block.ts b/src/compiler/compile/render_dom/Block.ts index 59beae1a39..c1dfb31c4a 100644 --- a/src/compiler/compile/render_dom/Block.ts +++ b/src/compiler/compile/render_dom/Block.ts @@ -10,7 +10,7 @@ export interface BlockOptions { renderer?: Renderer; comment?: string; key?: string; - bindings?: Map; + bindings?: Map; dependencies?: Set; } @@ -27,7 +27,7 @@ export default class Block { dependencies: Set; - bindings: Map; + bindings: Map; builders: { init: CodeBuilder; diff --git a/src/compiler/compile/render_dom/wrappers/EachBlock.ts b/src/compiler/compile/render_dom/wrappers/EachBlock.ts index ecd55c9b1d..c8fdae54a2 100644 --- a/src/compiler/compile/render_dom/wrappers/EachBlock.ts +++ b/src/compiler/compile/render_dom/wrappers/EachBlock.ts @@ -121,11 +121,15 @@ export default class EachBlockWrapper extends Wrapper { view_length: fixed_length === null ? `${iterations}.[✂${c}-${c+4}✂]` : fixed_length }; + const store = node.expression.node.name[0] === '$' ? node.expression.node.name.slice(1) : null; + node.contexts.forEach(prop => { this.block.bindings.set(prop.key.name, { object: this.vars.each_block_value, property: this.index_name, - snippet: attach_head(`${this.vars.each_block_value}[${this.index_name}]`, prop.tail) + snippet: attach_head(`${this.vars.each_block_value}[${this.index_name}]`, prop.tail), + store, + tail: attach_head(`[${this.index_name}]`, prop.tail) }); }); diff --git a/src/compiler/compile/render_dom/wrappers/Element/Binding.ts b/src/compiler/compile/render_dom/wrappers/Element/Binding.ts index 44372f8793..2fe54e7f33 100644 --- a/src/compiler/compile/render_dom/wrappers/Element/Binding.ts +++ b/src/compiler/compile/render_dom/wrappers/Element/Binding.ts @@ -249,7 +249,7 @@ function get_event_handler( snippet?: string; } { const value = get_value_from_dom(renderer, binding.parent, binding); - const store = binding.object[0] === '$' ? binding.object.slice(1) : null; + let store = binding.object[0] === '$' ? binding.object.slice(1) : null; let tail = ''; if (binding.node.expression.node.type === 'MemberExpression') { @@ -258,7 +258,13 @@ function get_event_handler( } if (binding.node.is_contextual) { - const { object, property, snippet } = block.bindings.get(name); + const binding = block.bindings.get(name); + const { object, property, snippet } = binding; + + if (binding.store) { + store = store || binding.store; + tail = `${binding.tail}${tail}`; + } return { uses_context: true,