From 8f5c1b81eb2b3472266f95245e14c2acf83dfac7 Mon Sep 17 00:00:00 2001 From: Th0rN13 Date: Mon, 4 May 2020 12:25:44 +0500 Subject: [PATCH] Fix: different group with identical values --- src/runtime/internal/dom.ts | 8 +- .../_config.js | 91 +++++++++++++++++++ .../main.svelte | 33 +++++++ .../_config.js | 3 +- 4 files changed, 129 insertions(+), 6 deletions(-) create mode 100644 test/runtime/samples/binding-input-checkbox-group-repeated-with-other/_config.js create mode 100644 test/runtime/samples/binding-input-checkbox-group-repeated-with-other/main.svelte diff --git a/src/runtime/internal/dom.ts b/src/runtime/internal/dom.ts index 0f4fd8add5..6ce4e3e758 100644 --- a/src/runtime/internal/dom.ts +++ b/src/runtime/internal/dom.ts @@ -124,8 +124,8 @@ export function xlink_attr(node, attribute, value) { node.setAttributeNS('http://www.w3.org/1999/xlink', attribute, value); } -// To force uncheck repeated group, need to store old value -let oldValue: Set = new Set(); +// To force uncheck repeated group, need to store old value for each group +let groups = new Map(); export function get_binding_group_value(group) { const value = new Set(); @@ -133,14 +133,14 @@ export function get_binding_group_value(group) { for (let i = 0; i < group.length; i += 1) { if (group[i].checked) { value.add(group[i].__value); - } else if (oldValue.has(group[i].__value)) { + } else if (groups.get(group) && groups.get(group).has(group[i].__value)) { force.push(group[i].__value); } } for (let i = 0; i < force.length; i += 1) { value.delete(force[i]); } - oldValue = value; + groups.set(group, value); return Array.from(value); } diff --git a/test/runtime/samples/binding-input-checkbox-group-repeated-with-other/_config.js b/test/runtime/samples/binding-input-checkbox-group-repeated-with-other/_config.js new file mode 100644 index 0000000000..8dcc265ac9 --- /dev/null +++ b/test/runtime/samples/binding-input-checkbox-group-repeated-with-other/_config.js @@ -0,0 +1,91 @@ +const values = [ + "a", + "b", +]; + +export default { + props: { + values, + selected: [], + selected2: [] + }, + + async test({ assert, target, window }) { + const inputs = target.querySelectorAll('input'); + assert.equal(inputs[0].checked, false); + assert.equal(inputs[1].checked, false); + assert.equal(inputs[2].checked, false); + assert.equal(inputs[3].checked, false); + assert.equal(inputs[4].checked, false); + assert.equal(inputs[5].checked, false); + + const event = new window.Event('change'); + + inputs[5].checked = true; + await inputs[5].dispatchEvent(event); + + assert.htmlEqual(target.innerHTML, ` + + + + + + + + +

+ + + + + +

b

+ `); + + inputs[3].checked = true; + await inputs[3].dispatchEvent(event); + + assert.htmlEqual(target.innerHTML, ` + + + + + + + + +

b

+ + + + + +

b

+ `); + + } +}; diff --git a/test/runtime/samples/binding-input-checkbox-group-repeated-with-other/main.svelte b/test/runtime/samples/binding-input-checkbox-group-repeated-with-other/main.svelte new file mode 100644 index 0000000000..45f78c97cf --- /dev/null +++ b/test/runtime/samples/binding-input-checkbox-group-repeated-with-other/main.svelte @@ -0,0 +1,33 @@ + + + + + + + + + + +

{selected.join(', ')}

+ + + + + +

{selected2.join( ', ' ) }

\ No newline at end of file diff --git a/test/runtime/samples/binding-input-checkbox-group-repeated/_config.js b/test/runtime/samples/binding-input-checkbox-group-repeated/_config.js index 2ce5bd4349..fdeb2ba0cb 100644 --- a/test/runtime/samples/binding-input-checkbox-group-repeated/_config.js +++ b/test/runtime/samples/binding-input-checkbox-group-repeated/_config.js @@ -1,7 +1,6 @@ const values = [ { name: 'Alpha' }, - { name: 'Beta' }, - { name: 'Gamma' } + { name: 'Beta' } ]; export default {