Skip to content

Commit 8740cfe

Browse files
authored
Merge pull request #299 from sveltejs/gh-290-b
[WIP] failing tests for second bug in #290
2 parents b81107f + 34ab0c2 commit 8740cfe

File tree

8 files changed

+109
-9
lines changed

8 files changed

+109
-9
lines changed

src/generators/dom/visitors/Component.js

+1-3
Original file line numberDiff line numberDiff line change
@@ -96,9 +96,7 @@ export default {
9696

9797
if ( local.bindings.length ) {
9898
const bindings = local.bindings.map( binding => {
99-
const parts = binding.value.split( '.' );
100-
const tail = parts.pop();
101-
return `if ( '${tail}' in ${parts.join( '.' )} ) ${name}_initialData.${binding.name} = ${binding.value};`;
99+
return `if ( ${binding.prop} in ${binding.obj} ) ${name}_initialData.${binding.name} = ${binding.value};`;
102100
});
103101

104102
statements.push( bindings.join( '\n' ) );

src/generators/dom/visitors/attributes/binding/index.js

+19-6
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,21 @@ export default function createBinding ( generator, node, attribute, current, loc
1111
if ( contextual ) local.allUsedContexts.add( parts[0] );
1212

1313
if ( local.isComponent ) {
14-
local.bindings.push({
15-
name: attribute.name,
16-
value: contextual ? attribute.value : `root.${attribute.value}`
17-
});
14+
let obj;
15+
let prop;
16+
let value;
17+
18+
if ( contextual ) {
19+
obj = current.listNames[ parts[0] ];
20+
prop = current.indexNames[ parts[0] ];
21+
value = attribute.value;
22+
} else {
23+
prop = `'${parts.slice( -1 )}'`;
24+
obj = parts.length > 1 ? `root.${parts.slice( 0, -1 ).join( '.' )}` : `root`;
25+
value = `root.${attribute.value}`;
26+
}
27+
28+
local.bindings.push({ name: attribute.name, value, obj, prop });
1829
}
1930

2031
const handler = current.getUniqueName( `${local.name}ChangeHandler` );
@@ -59,9 +70,11 @@ export default function createBinding ( generator, node, attribute, current, loc
5970
const listName = current.listNames[ parts[0] ];
6071
const indexName = current.indexNames[ parts[0] ];
6172

73+
const context = local.isComponent ? `_context` : `__svelte`;
74+
6275
setter = deindent`
63-
var list = this.__svelte.${listName};
64-
var index = this.__svelte.${indexName};
76+
var list = this.${context}.${listName};
77+
var index = this.${context}.${indexName};
6578
list[index]${parts.slice( 1 ).map( part => `.${part}` ).join( '' )} = ${value};
6679
6780
component._set({ ${prop}: component.get( '${prop}' ) });
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
<input bind:value>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
export default {
2+
html: `
3+
<input><input><input>
4+
<p>foo, bar, baz</p>
5+
`,
6+
7+
test ( assert, component, target, window ) {
8+
const event = new window.MouseEvent( 'input' );
9+
const inputs = target.querySelectorAll( 'input' );
10+
11+
inputs[0].value = 'blah';
12+
inputs[0].dispatchEvent( event );
13+
14+
assert.deepEqual( component.get( 'a' ), [{ name: 'blah' }, { name: 'bar' }, { name: 'baz' }] );
15+
assert.htmlEqual( target.innerHTML, `
16+
<input><input><input>
17+
<p>blah, bar, baz</p>
18+
` );
19+
20+
component.teardown();
21+
}
22+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
{{#each a as x}}
2+
<Widget bind:value='x.name'/>
3+
{{/each}}
4+
5+
<p>{{a.map(getName).join(', ')}}</p>
6+
7+
<script>
8+
import Widget from './Widget.html';
9+
10+
export default {
11+
data () {
12+
return {
13+
a: [{ name: 'foo' }, { name: 'bar' }, { name: 'baz' }],
14+
getName: x => x.name
15+
};
16+
},
17+
18+
components: {
19+
Widget
20+
}
21+
};
22+
</script>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
<input bind:value>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
export default {
2+
html: `
3+
<input><input><input>
4+
<p>foo, bar, baz</p>
5+
`,
6+
7+
test ( assert, component, target, window ) {
8+
const event = new window.MouseEvent( 'input' );
9+
const inputs = target.querySelectorAll( 'input' );
10+
11+
inputs[0].value = 'blah';
12+
inputs[0].dispatchEvent( event );
13+
14+
assert.deepEqual( component.get( 'a' ), [ 'blah', 'bar', 'baz' ] );
15+
assert.htmlEqual( target.innerHTML, `
16+
<input><input><input>
17+
<p>blah, bar, baz</p>
18+
` );
19+
20+
component.teardown();
21+
}
22+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
{{#each a as x}}
2+
<Widget bind:value='x'/>
3+
{{/each}}
4+
5+
<p>{{a.join(', ')}}</p>
6+
7+
<script>
8+
import Widget from './Widget.html';
9+
10+
export default {
11+
data () {
12+
return {
13+
a: [ 'foo', 'bar', 'baz' ]
14+
};
15+
},
16+
17+
components: {
18+
Widget
19+
}
20+
};
21+
</script>

0 commit comments

Comments
 (0)