Skip to content

Commit 1f4e73f

Browse files
committed
binding member expression should only invalidate the object, not the member property
1 parent 81fc3f8 commit 1f4e73f

File tree

10 files changed

+84
-7
lines changed

10 files changed

+84
-7
lines changed

src/compiler/compile/render_dom/wrappers/EachBlock.ts

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -219,11 +219,7 @@ export default class EachBlockWrapper extends Wrapper {
219219
update_anchor_node,
220220
update_mount_node
221221
};
222-
223-
const all_dependencies = new Set(this.block.dependencies); // TODO should be dynamic deps only
224-
this.node.expression.dynamic_dependencies().forEach((dependency: string) => {
225-
all_dependencies.add(dependency);
226-
});
222+
const all_dependencies = new Set<string>(this.node.expression.dynamic_dependencies());
227223
if (this.node.key) {
228224
this.node.key.dynamic_dependencies().forEach((dependency: string) => {
229225
all_dependencies.add(dependency);

src/compiler/compile/render_dom/wrappers/Element/Binding.ts

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,20 @@ export default class BindingWrapper {
7070
return dependencies;
7171
}
7272

73+
get_update_dependencies() {
74+
const object = get_object(this.node.expression.node).name;
75+
const dependencies = new Set(object);
76+
77+
78+
const indirect_dependencies = this.parent.renderer.component.indirect_dependencies.get(object);
79+
if (indirect_dependencies) {
80+
indirect_dependencies.forEach(indirect_dependency => {
81+
dependencies.add(indirect_dependency);
82+
});
83+
}
84+
return dependencies;
85+
}
86+
7387
is_readonly_media_attribute() {
7488
return this.node.is_readonly_media_attribute();
7589
}

src/compiler/compile/render_dom/wrappers/Element/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -466,7 +466,7 @@ export default class ElementWrapper extends Wrapper {
466466

467467
binding_group.bindings.forEach(binding => {
468468
// TODO this is a mess
469-
add_to_set(dependencies, binding.get_dependencies());
469+
add_to_set(dependencies, binding.get_update_dependencies());
470470
add_to_set(contextual_dependencies, binding.handler.contextual_dependencies);
471471

472472
binding.render(block, lock);

src/compiler/compile/render_dom/wrappers/shared/bind_this.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ export default function bind_this(component: Component, block: Block, binding: B
1212
const callee = block.renderer.reference(fn.name);
1313

1414
const { contextual_dependencies, mutation } = binding.handler;
15-
const dependencies = binding.get_dependencies();
15+
const dependencies = binding.get_update_dependencies();
1616

1717
const body = b`
1818
${mutation}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
// binding member expression shouldn't invalidate the property name
2+
export default {
3+
async test({ assert, component, target, window }) {
4+
const input = target.querySelector('input');
5+
assert.deepEqual(component.logs.length, 1);
6+
assert.equal(input.value, 'abc');
7+
8+
input.value = 'hij';
9+
await input.dispatchEvent(new window.Event('input'));
10+
11+
assert.deepEqual(component.values.a, 'hij');
12+
assert.deepEqual(component.logs.length, 1);
13+
14+
component.paths = ['b'];
15+
assert.deepEqual(component.logs.length, 2);
16+
assert.equal(input.value, 'def');
17+
}
18+
};
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
<script>
2+
export let values = { a: "abc", b: "def" };
3+
export let paths = ["a"];
4+
export let logs = [];
5+
6+
$: paths && logs.push("paths updated");
7+
</script>
8+
9+
<input bind:value={values[paths[0]]} />
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
export default {
2+
html: '<div>content</div><div>content</div><div>content</div>',
3+
4+
test({ assert, target, component }) {
5+
const divs = target.querySelectorAll('div');
6+
assert.equal(component.refs[0], divs[0]);
7+
assert.equal(component.refs[1], divs[1]);
8+
assert.equal(component.refs[2], divs[2]);
9+
}
10+
};
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
<script>
2+
export let data = [ { id: "1" }, { id: "2" }, { id: "3" } ];
3+
4+
export let refs = [];
5+
6+
$: list = data.reverse()
7+
</script>
8+
9+
{#each list as { id }, index (id)}
10+
<div bind:this={refs[index]}>
11+
content
12+
</div>
13+
{/each}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
// binding member expression shouldn't invalidate the property name
2+
export default {
3+
test({ assert, component, target }) {
4+
const div = target.querySelector('div');
5+
assert.equal(div, component.container.a);
6+
assert.deepEqual(component.logs.length, 1);
7+
}
8+
};
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
<script>
2+
export let container = {};
3+
export let paths = ["a"];
4+
export let logs = [];
5+
6+
$: paths && logs.push("paths updated");
7+
</script>
8+
9+
<div bind:this={container[paths[0]]} />

0 commit comments

Comments
 (0)