diff --git a/src/compile/nodes/Element.ts b/src/compile/nodes/Element.ts index a3040b81c2..45a01c7bc5 100644 --- a/src/compile/nodes/Element.ts +++ b/src/compile/nodes/Element.ts @@ -399,6 +399,7 @@ export default class Element extends Node { if (eventHandlerOrBindingUsesContext) { initialProps.push(`ctx`); block.builders.update.addLine(`${node}._svelte.ctx = ctx;`); + block.maintainContext = true; } if (initialProps.length) { diff --git a/test/runtime/samples/binding-input-checkbox-with-event-in-each/_config.js b/test/runtime/samples/binding-input-checkbox-with-event-in-each/_config.js new file mode 100644 index 0000000000..390d39ea8e --- /dev/null +++ b/test/runtime/samples/binding-input-checkbox-with-event-in-each/_config.js @@ -0,0 +1,39 @@ +export default { + data: { + cats: [ + { + name: "cat 0", + checked: false, + }, + { + name: "cat 1", + checked: false, + }, + ], + }, + + html: ` + + + `, + + test(assert, component, target, window) { + const { cats } = component.get(); + const newCats = cats.slice(); + newCats.push({ + name: "cat " + cats.length, + checked: false, + }); + component.set({ cats: newCats }); + + let inputs = target.querySelectorAll('input'); + assert.equal(inputs.length, 3); + + const event = new window.Event('change'); + inputs[0].checked = true; + inputs[0].dispatchEvent(event); + + inputs = target.querySelectorAll('input'); + assert.equal(inputs.length, 3); + } +}; diff --git a/test/runtime/samples/binding-input-checkbox-with-event-in-each/main.html b/test/runtime/samples/binding-input-checkbox-with-event-in-each/main.html new file mode 100644 index 0000000000..e555f4c4b6 --- /dev/null +++ b/test/runtime/samples/binding-input-checkbox-with-event-in-each/main.html @@ -0,0 +1,14 @@ +{#each cats as cat (cat.name)} + +{/each} + + \ No newline at end of file