mirror of https://github.com/sveltejs/svelte
Merge pull request #2415 from sveltejs/gh-2356
Prevent infinite loops with chained bindingspull/2418/head
commit
aae969d6e2
@ -0,0 +1,18 @@
|
|||||||
|
<script>
|
||||||
|
import Two from './Two.svelte';
|
||||||
|
|
||||||
|
export let list;
|
||||||
|
export let i;
|
||||||
|
|
||||||
|
function handle_click() {
|
||||||
|
list = [...list, {}];
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
{#each list as item, j}
|
||||||
|
<Two bind:value={item.value} {i} {j}/>
|
||||||
|
{/each}
|
||||||
|
|
||||||
|
<button on:click={handle_click}>
|
||||||
|
click me
|
||||||
|
</button>
|
@ -0,0 +1,4 @@
|
|||||||
|
<script>
|
||||||
|
export let i, j;
|
||||||
|
export let value = `${i}:${j}`;
|
||||||
|
</script>
|
@ -0,0 +1,23 @@
|
|||||||
|
export default {
|
||||||
|
html: `
|
||||||
|
<button>click me</button>
|
||||||
|
<button>click me</button>
|
||||||
|
|
||||||
|
<p>{"value":"0:0"}</p>
|
||||||
|
<p></p>
|
||||||
|
`,
|
||||||
|
|
||||||
|
async test({ assert, target, window }) {
|
||||||
|
const button = target.querySelectorAll('button')[1];
|
||||||
|
|
||||||
|
await button.dispatchEvent(new window.Event('click'));
|
||||||
|
|
||||||
|
assert.htmlEqual(target.innerHTML, `
|
||||||
|
<button>click me</button>
|
||||||
|
<button>click me</button>
|
||||||
|
|
||||||
|
<p>{"value":"0:0"}</p>
|
||||||
|
<p>{"value":"1:0"}</p>
|
||||||
|
`);
|
||||||
|
}
|
||||||
|
};
|
@ -0,0 +1,14 @@
|
|||||||
|
<script>
|
||||||
|
import One from "./One.svelte";
|
||||||
|
|
||||||
|
const obj = {
|
||||||
|
a: [{}],
|
||||||
|
b: []
|
||||||
|
};
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<One bind:list={obj.a} i={0}/>
|
||||||
|
<One bind:list={obj.b} i={1}/>
|
||||||
|
|
||||||
|
<p>{obj.a.map(JSON.stringify)}</p>
|
||||||
|
<p>{obj.b.map(JSON.stringify)}</p>
|
@ -0,0 +1,18 @@
|
|||||||
|
<script>
|
||||||
|
import Two from './Two.svelte';
|
||||||
|
|
||||||
|
export let list;
|
||||||
|
export let i;
|
||||||
|
|
||||||
|
function handle_click() {
|
||||||
|
list = [...list, {}];
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
{#each list as item, j}
|
||||||
|
<Two bind:value={item.value} {i} {j}/>
|
||||||
|
{/each}
|
||||||
|
|
||||||
|
<button on:click={handle_click}>
|
||||||
|
click me
|
||||||
|
</button>
|
@ -0,0 +1,4 @@
|
|||||||
|
<script>
|
||||||
|
export let i, j;
|
||||||
|
export let value = { i, j };
|
||||||
|
</script>
|
@ -0,0 +1,23 @@
|
|||||||
|
export default {
|
||||||
|
html: `
|
||||||
|
<button>click me</button>
|
||||||
|
<button>click me</button>
|
||||||
|
|
||||||
|
<p>{"value":{"i":0,"j":0}}</p>
|
||||||
|
<p></p>
|
||||||
|
`,
|
||||||
|
|
||||||
|
async test({ assert, target, window }) {
|
||||||
|
const button = target.querySelectorAll('button')[1];
|
||||||
|
|
||||||
|
await button.dispatchEvent(new window.Event('click'));
|
||||||
|
|
||||||
|
assert.htmlEqual(target.innerHTML, `
|
||||||
|
<button>click me</button>
|
||||||
|
<button>click me</button>
|
||||||
|
|
||||||
|
<p>{"value":{"i":0,"j":0}}</p>
|
||||||
|
<p>{"value":{"i":1,"j":0}}</p>
|
||||||
|
`);
|
||||||
|
}
|
||||||
|
};
|
@ -0,0 +1,14 @@
|
|||||||
|
<script>
|
||||||
|
import One from "./One.svelte";
|
||||||
|
|
||||||
|
const obj = {
|
||||||
|
a: [{}],
|
||||||
|
b: []
|
||||||
|
};
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<One bind:list={obj.a} i={0}/>
|
||||||
|
<One bind:list={obj.b} i={1}/>
|
||||||
|
|
||||||
|
<p>{obj.a.map(JSON.stringify)}</p>
|
||||||
|
<p>{obj.b.map(JSON.stringify)}</p>
|
@ -0,0 +1,18 @@
|
|||||||
|
<script>
|
||||||
|
import Two from './Two.svelte';
|
||||||
|
|
||||||
|
export let list;
|
||||||
|
export let i;
|
||||||
|
|
||||||
|
function handle_click() {
|
||||||
|
list = [...list, {}];
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
{#each list as item, j}
|
||||||
|
<Two bind:value={item.value} {i} {j}/>
|
||||||
|
{/each}
|
||||||
|
|
||||||
|
<button on:click={handle_click}>
|
||||||
|
click me
|
||||||
|
</button>
|
@ -0,0 +1,10 @@
|
|||||||
|
<script>
|
||||||
|
import { onMount } from 'svelte';
|
||||||
|
|
||||||
|
export let i, j;
|
||||||
|
export let value;
|
||||||
|
|
||||||
|
onMount(() => {
|
||||||
|
value = { i, j };
|
||||||
|
});
|
||||||
|
</script>
|
@ -0,0 +1,31 @@
|
|||||||
|
export default {
|
||||||
|
html: `
|
||||||
|
<button>click me</button>
|
||||||
|
<button>click me</button>
|
||||||
|
|
||||||
|
<p>{"value":{"i":0,"j":0}}</p>
|
||||||
|
<p></p>
|
||||||
|
`,
|
||||||
|
|
||||||
|
ssrHtml: `
|
||||||
|
<button>click me</button>
|
||||||
|
<button>click me</button>
|
||||||
|
|
||||||
|
<p>{}</p>
|
||||||
|
<p></p>
|
||||||
|
`,
|
||||||
|
|
||||||
|
async test({ assert, target, window }) {
|
||||||
|
const button = target.querySelectorAll('button')[1];
|
||||||
|
|
||||||
|
await button.dispatchEvent(new window.Event('click'));
|
||||||
|
|
||||||
|
assert.htmlEqual(target.innerHTML, `
|
||||||
|
<button>click me</button>
|
||||||
|
<button>click me</button>
|
||||||
|
|
||||||
|
<p>{"value":{"i":0,"j":0}}</p>
|
||||||
|
<p>{"value":{"i":1,"j":0}}</p>
|
||||||
|
`);
|
||||||
|
}
|
||||||
|
};
|
@ -0,0 +1,14 @@
|
|||||||
|
<script>
|
||||||
|
import One from "./One.svelte";
|
||||||
|
|
||||||
|
const obj = {
|
||||||
|
a: [{}],
|
||||||
|
b: []
|
||||||
|
};
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<One bind:list={obj.a} i={0}/>
|
||||||
|
<One bind:list={obj.b} i={1}/>
|
||||||
|
|
||||||
|
<p>{obj.a.map(JSON.stringify)}</p>
|
||||||
|
<p>{obj.b.map(JSON.stringify)}</p>
|
Loading…
Reference in new issue