fix contextual component bindings

pull/1864/head
Rich Harris 7 years ago
parent 6c854a6d57
commit 4c2fdcf657

@ -445,8 +445,10 @@ export default class ElementWrapper extends Wrapper {
const contextual_dependencies = new Set();
group.bindings.forEach(binding => {
// TODO this is a mess
addToSet(dependencies, binding.dependencies);
addToSet(contextual_dependencies, binding.contextual_dependencies);
addToSet(contextual_dependencies, binding.handler.contextual_dependencies);
if (!binding.updateDom) return;

@ -192,7 +192,17 @@ export default class InlineComponentWrapper extends Wrapper {
const contextual_dependencies = Array.from(binding.expression.contextual_dependencies);
const dependencies = Array.from(binding.expression.dependencies);
const lhs = component.source.slice(binding.expression.node.start, binding.expression.node.end).trim();
let lhs = component.source.slice(binding.expression.node.start, binding.expression.node.end).trim();
if (binding.isContextual && binding.expression.node.type === 'Identifier') {
// bind:x={y} — we can't just do `y = x`, we need to
// to `array[index] = x;
const { name } = binding.expression.node;
const { object, property, snippet } = block.bindings.get(name)();
lhs = snippet;
contextual_dependencies.push(object, property);
}
const args = ['value'];
if (contextual_dependencies.length > 0) {

@ -1,6 +1,8 @@
<script>
import Foo from './Foo.html';
export let p;
export let foo;
export let bar;
export let baz;

@ -18,7 +18,7 @@ export default {
inputs[0].value = 'blah';
await inputs[0].dispatchEvent(event);
assert.deepEqual(component.a, [ 'blah', 'bar', 'baz' ]);
assert.deepEqual(component.a, ['blah', 'bar', 'baz']);
assert.htmlEqual(target.innerHTML, `
<input><input><input>
<p>blah, bar, baz</p>

@ -1,7 +1,7 @@
<script>
import Widget from './Widget.html';
export let a = [ 'foo', 'bar', 'baz' ];
export let a = ['foo', 'bar', 'baz'];
</script>
{#each a as x}

Loading…
Cancel
Save