From 63e5d1f5a9d0befbbfa2e7db7eec87f1ba0dbe1d Mon Sep 17 00:00:00 2001 From: Th0r Date: Sat, 2 May 2020 01:29:52 +0500 Subject: [PATCH 1/3] Fix bind:this in each repetitive variable --- src/compiler/compile/render_dom/wrappers/shared/bind_this.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/compiler/compile/render_dom/wrappers/shared/bind_this.ts b/src/compiler/compile/render_dom/wrappers/shared/bind_this.ts index 97199a71c2e3..b5df0489df63 100644 --- a/src/compiler/compile/render_dom/wrappers/shared/bind_this.ts +++ b/src/compiler/compile/render_dom/wrappers/shared/bind_this.ts @@ -54,6 +54,9 @@ export default function bind_this(component: Component, block: Block, binding: B const args = []; for (const id of contextual_dependencies) { + if (block.variables.has(id.name)) { + if (block.renderer.context_lookup.get(id.name).is_contextual) continue; + } args.push(id); block.add_variable(id, block.renderer.reference(id.name)); } From 65fc4e3b969e8d254113b669332b6697bc300c5e Mon Sep 17 00:00:00 2001 From: Th0r Date: Sat, 2 May 2020 02:59:18 +0500 Subject: [PATCH 2/3] Fix: push deps to array before check --- src/compiler/compile/render_dom/wrappers/shared/bind_this.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/compiler/compile/render_dom/wrappers/shared/bind_this.ts b/src/compiler/compile/render_dom/wrappers/shared/bind_this.ts index b5df0489df63..8a9830b01b6b 100644 --- a/src/compiler/compile/render_dom/wrappers/shared/bind_this.ts +++ b/src/compiler/compile/render_dom/wrappers/shared/bind_this.ts @@ -54,10 +54,10 @@ export default function bind_this(component: Component, block: Block, binding: B const args = []; for (const id of contextual_dependencies) { + args.push(id); if (block.variables.has(id.name)) { if (block.renderer.context_lookup.get(id.name).is_contextual) continue; } - args.push(id); block.add_variable(id, block.renderer.reference(id.name)); } From ae0fd596c62c76b9c5efd6a98f706d2245d74406 Mon Sep 17 00:00:00 2001 From: Th0r Date: Sat, 2 May 2020 02:59:40 +0500 Subject: [PATCH 3/3] Add test --- .../binding-this-each-object-props/_config.js | 14 ++++++++++++++ .../binding-this-each-object-props/main.svelte | 13 +++++++++++++ .../binding-this-each-object-spread/_config.js | 14 ++++++++++++++ .../binding-this-each-object-spread/main.svelte | 13 +++++++++++++ 4 files changed, 54 insertions(+) create mode 100644 test/runtime/samples/binding-this-each-object-props/_config.js create mode 100644 test/runtime/samples/binding-this-each-object-props/main.svelte create mode 100644 test/runtime/samples/binding-this-each-object-spread/_config.js create mode 100644 test/runtime/samples/binding-this-each-object-spread/main.svelte diff --git a/test/runtime/samples/binding-this-each-object-props/_config.js b/test/runtime/samples/binding-this-each-object-props/_config.js new file mode 100644 index 000000000000..5372667b82b6 --- /dev/null +++ b/test/runtime/samples/binding-this-each-object-props/_config.js @@ -0,0 +1,14 @@ +export default { + html: ``, + + async test({ assert, component, target }) { + component.visible = true; + assert.htmlEqual(target.innerHTML, ` +
b
b
c
c
+ `); + assert.equal(component.items1[1], target.querySelector('div')); + assert.equal(component.items2[1], target.querySelector('div:nth-child(2)')); + assert.equal(component.items1[2], target.querySelector('div:nth-child(3)')); + assert.equal(component.items2[2], target.querySelector('div:last-child')); + } +}; diff --git a/test/runtime/samples/binding-this-each-object-props/main.svelte b/test/runtime/samples/binding-this-each-object-props/main.svelte new file mode 100644 index 000000000000..9654a5841818 --- /dev/null +++ b/test/runtime/samples/binding-this-each-object-props/main.svelte @@ -0,0 +1,13 @@ + + +{#each data as item (item.id)} +
{item.text}
+
{item.text}
+{/each} diff --git a/test/runtime/samples/binding-this-each-object-spread/_config.js b/test/runtime/samples/binding-this-each-object-spread/_config.js new file mode 100644 index 000000000000..cecec08db903 --- /dev/null +++ b/test/runtime/samples/binding-this-each-object-spread/_config.js @@ -0,0 +1,14 @@ +export default { + html: ``, + + async test({ assert, component, target }) { + component.visible = true; + assert.htmlEqual(target.innerHTML, ` +
a
a
b
b
+ `); + assert.equal(component.items1[1], target.querySelector('div')); + assert.equal(component.items2[1], target.querySelector('div:nth-child(2)')); + assert.equal(component.items1[2], target.querySelector('div:nth-child(3)')); + assert.equal(component.items2[2], target.querySelector('div:last-child')); + } +}; diff --git a/test/runtime/samples/binding-this-each-object-spread/main.svelte b/test/runtime/samples/binding-this-each-object-spread/main.svelte new file mode 100644 index 000000000000..256ed0ede6e8 --- /dev/null +++ b/test/runtime/samples/binding-this-each-object-spread/main.svelte @@ -0,0 +1,13 @@ + + +{#each data as {id, text} (id)} +
{text}
+
{text}
+{/each}