diff --git a/src/compiler/compile/render_dom/wrappers/EachBlock.ts b/src/compiler/compile/render_dom/wrappers/EachBlock.ts index ad5c5518d1..2c0f5f68b4 100644 --- a/src/compiler/compile/render_dom/wrappers/EachBlock.ts +++ b/src/compiler/compile/render_dom/wrappers/EachBlock.ts @@ -447,6 +447,8 @@ export default class EachBlockWrapper extends Wrapper { : '@destroy_block'; if (this.dependencies.size) { + this.block.maintain_context = true; + this.updates.push(b` const ${this.vars.each_block_value} = ${snippet}; ${this.renderer.options.dev && b`@validate_each_argument(${this.vars.each_block_value});`} diff --git a/test/runtime/samples/each-block-keyed-bind-group/_config.js b/test/runtime/samples/each-block-keyed-bind-group/_config.js new file mode 100644 index 0000000000..d02730b7f9 --- /dev/null +++ b/test/runtime/samples/each-block-keyed-bind-group/_config.js @@ -0,0 +1,65 @@ +export default { + html: ` + + + + + + `, + + async test({ assert, target, window }) { + const [input1, input2, input3, input4, input5] = target.querySelectorAll('input'); + const event = new window.Event('change'); + + input3.checked = true; + await input3.dispatchEvent(event); + + assert.htmlEqual(target.innerHTML, ` + + + + + + `); + + assert.equal(input1.checked, false); + assert.equal(input2.checked, false); + assert.equal(input3.checked, true); + assert.equal(input4.checked, false); + assert.equal(input5.checked, false); + + input4.checked = true; + await input4.dispatchEvent(event); + + assert.htmlEqual(target.innerHTML, ` + + + + + + `); + + assert.equal(input1.checked, false); + assert.equal(input2.checked, false); + assert.equal(input3.checked, true); + assert.equal(input4.checked, true); + assert.equal(input5.checked, false); + + input3.checked = false; + await input3.dispatchEvent(event); + + assert.htmlEqual(target.innerHTML, ` + + + + + + `); + + assert.equal(input1.checked, false); + assert.equal(input2.checked, false); + assert.equal(input3.checked, false); + assert.equal(input4.checked, true); + assert.equal(input5.checked, false); + } +}; diff --git a/test/runtime/samples/each-block-keyed-bind-group/main.svelte b/test/runtime/samples/each-block-keyed-bind-group/main.svelte new file mode 100644 index 0000000000..26e1cfb2f3 --- /dev/null +++ b/test/runtime/samples/each-block-keyed-bind-group/main.svelte @@ -0,0 +1,21 @@ + + +{#each flavours as flavour (flavour)} + +{/each}