fix some binding tests

pull/1864/head
Rich Harris 7 years ago
parent 2bd3ccc12c
commit 8e6084d135

@ -153,7 +153,8 @@ export default class BindingWrapper {
return { return {
name: this.node.name, name: this.node.name,
object: name, object: name,
handler: handler, handler,
snippet,
usesContext: handler.usesContext, usesContext: handler.usesContext,
updateDom: updateDom, updateDom: updateDom,
initialUpdate: initialUpdate, initialUpdate: initialUpdate,
@ -281,7 +282,8 @@ function getValueFromDom(
if (name === 'group') { if (name === 'group') {
const bindingGroup = getBindingGroup(renderer, binding.node.expression.node); const bindingGroup = getBindingGroup(renderer, binding.node.expression.node);
if (type === 'checkbox') { if (type === 'checkbox') {
return `@getBindingGroupValue(#component.$$bindingGroups[${bindingGroup}])`; renderer.component.init_uses_self = true;
return `@getBindingGroupValue($$self.$$bindingGroups[${bindingGroup}])`;
} }
return `this.__value`; return `this.__value`;

@ -540,15 +540,15 @@ export default class ElementWrapper extends Wrapper {
} }
}); });
const allInitialStateIsDefined = group.bindings const someInitialStateIsUndefined = group.bindings
.map(binding => `'${binding.object}' in ctx`) .map(binding => `${binding.snippet} === void 0`)
.join(' && '); .join(' || ');
if (this.node.name === 'select' || group.bindings.find(binding => binding.name === 'indeterminate' || binding.isReadOnlyMediaAttribute)) { if (this.node.name === 'select' || group.bindings.find(binding => binding.name === 'indeterminate' || binding.isReadOnlyMediaAttribute)) {
renderer.hasComplexBindings = true; renderer.hasComplexBindings = true;
block.builders.hydrate.addLine( block.builders.hydrate.addLine(
`if (!(${allInitialStateIsDefined})) #component.$$root._beforecreate.push(${handler});` `if (${someInitialStateIsUndefined}) @after_render(() => ${callee}.call(${this.var}));`
); );
} }
@ -556,7 +556,7 @@ export default class ElementWrapper extends Wrapper {
renderer.hasComplexBindings = true; renderer.hasComplexBindings = true;
block.builders.hydrate.addLine( block.builders.hydrate.addLine(
`#component.$$root._beforecreate.push(${handler});` `@after_render(() => ${callee}.call(${this.var}));`
); );
} }
}); });

@ -14,7 +14,7 @@
</script> </script>
<select bind:value={selected.letter}> <select bind:value={selected.letter}>
{#each uppercase as letter} {#each uppercase() as letter}
<option value="{letter}">{letter}</option> <option value="{letter}">{letter}</option>
{/each} {/each}
</select> </select>

@ -5,6 +5,8 @@ const values = [
]; ];
export default { export default {
solo: 1,
props: { props: {
values, values,
selected: values[1] selected: values[1]
@ -25,18 +27,18 @@ export default {
<p>Beta</p>`, <p>Beta</p>`,
test ( assert, component, target, window ) { async test(assert, component, target, window) {
const inputs = target.querySelectorAll( 'input' ); const inputs = target.querySelectorAll('input');
assert.equal( inputs[0].checked, false ); assert.equal(inputs[0].checked, false);
assert.equal( inputs[1].checked, true ); assert.equal(inputs[1].checked, true);
assert.equal( inputs[2].checked, false ); assert.equal(inputs[2].checked, false);
const event = new window.Event( 'change' ); const event = new window.Event('change');
inputs[0].checked = true; inputs[0].checked = true;
inputs[0].dispatchEvent( event ); await inputs[0].dispatchEvent(event);
assert.htmlEqual( target.innerHTML, ` assert.htmlEqual(target.innerHTML, `
<label> <label>
<input type="radio" value="[object Object]"> Alpha <input type="radio" value="[object Object]"> Alpha
</label> </label>
@ -50,18 +52,18 @@ export default {
</label> </label>
<p>Alpha</p> <p>Alpha</p>
` ); `);
assert.equal( inputs[0].checked, true ); assert.equal(inputs[0].checked, true);
assert.equal( inputs[1].checked, false ); assert.equal(inputs[1].checked, false);
assert.equal( inputs[2].checked, false ); assert.equal(inputs[2].checked, false);
component.selected = values[2]; component.selected = values[2];
assert.equal( inputs[0].checked, false ); assert.equal(inputs[0].checked, false);
assert.equal( inputs[1].checked, false ); assert.equal(inputs[1].checked, false);
assert.equal( inputs[2].checked, true ); assert.equal(inputs[2].checked, true);
assert.htmlEqual( target.innerHTML, ` assert.htmlEqual(target.innerHTML, `
<label> <label>
<input type="radio" value="[object Object]"> Alpha <input type="radio" value="[object Object]"> Alpha
</label> </label>
@ -75,6 +77,6 @@ export default {
</label> </label>
<p>Gamma</p> <p>Gamma</p>
` ); `);
} }
}; };

Loading…
Cancel
Save