Skip to content

Commit 7510f9c

Browse files
authored
Merge pull request #809 from sveltejs/gh-804
prevent mutation bug from incorrectly calling observer
2 parents e30ff54 + fb97256 commit 7510f9c

File tree

4 files changed

+51
-1
lines changed

4 files changed

+51
-1
lines changed

src/generators/dom/visitors/Component.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -185,7 +185,7 @@ export default function visitComponent(
185185
_bind: function(changed, childState) {
186186
var state = #component.get(), newState = {};
187187
${setParentFromChildOnChange}
188-
${name_updating} = changed;
188+
${name_updating} = @assign({}, changed);
189189
#component._set(newState);
190190
${name_updating} = {};
191191
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
<input type="number" bind:value="field1">
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
export default {
2+
html: `
3+
<input type='number'>
4+
<p>field1: 1</p>
5+
<p>field2: 2</p>
6+
`,
7+
8+
test(assert, component, target, window) {
9+
let triggered = false;
10+
component.refs.nested.observe('field2', () => {
11+
triggered = true;
12+
}, { init: false });
13+
14+
const input = target.querySelector('input');
15+
const event = new window.Event('input');
16+
17+
input.value = 3;
18+
input.dispatchEvent(event); // will throw error if observer fires incorrectly
19+
20+
assert.ok(!triggered);
21+
22+
assert.htmlEqual(target.innerHTML, `
23+
<input type='number'>
24+
<p>field1: 3</p>
25+
<p>field2: 2</p>
26+
`);
27+
}
28+
};
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
<Nested ref:nested bind:field1="myObject.field1" bind:field2="myObject.field2" />
2+
<p>field1: {{myObject.field1}}</p>
3+
<p>field2: {{myObject.field2}}</p>
4+
5+
<script>
6+
import Nested from './Nested.html';
7+
8+
export default {
9+
components: {
10+
Nested
11+
},
12+
data() {
13+
return {
14+
myObject: {
15+
field1: 1,
16+
field2: 2
17+
}
18+
};
19+
}
20+
};
21+
</script>

0 commit comments

Comments
 (0)