Merge pull request #500 from sveltejs/gh-498

Correctly group checkbox inputs together
pull/506/head
Rich Harris 8 years ago committed by GitHub
commit 1a96dd3e5c

@ -4,7 +4,7 @@ import getSetter from '../shared/binding/getSetter.js';
import getStaticAttributeValue from './getStaticAttributeValue.js';
export default function visitBinding ( generator, block, state, node, attribute ) {
const { name, keypath } = flattenReference( attribute.value );
const { name, keypath, parts } = flattenReference( attribute.value );
const { snippet, contexts, dependencies } = block.contextualise( attribute.value );
if ( dependencies.length > 1 ) throw new Error( 'An unexpected situation arose. Please raise an issue at https://github.com/sveltejs/svelte/issues — thanks!' );
@ -17,7 +17,7 @@ export default function visitBinding ( generator, block, state, node, attribute
const handler = block.getUniqueName( `${state.parentNode}_${eventName}_handler` );
const isMultipleSelect = node.name === 'select' && node.attributes.find( attr => attr.name.toLowerCase() === 'multiple' ); // TODO use getStaticAttributeValue
const type = getStaticAttributeValue( node, 'type' );
const bindingGroup = attribute.name === 'group' ? getBindingGroup( generator, keypath ) : null;
const bindingGroup = attribute.name === 'group' ? getBindingGroup( generator, parts.join( '.' ) ) : null;
const value = getBindingValue( generator, block, state, node, attribute, isMultipleSelect, bindingGroup, type );
let setter = getSetter({ block, name, context: '_svelte', attribute, dependencies, value });

@ -0,0 +1,78 @@
const values = [
{ name: 'Alpha' },
{ name: 'Beta' },
{ name: 'Gamma' }
];
export default {
data: {
values,
selected: [ values[1] ]
},
'skip-ssr': true, // values are rendered as [object Object]
html: `
<label>
<input type="checkbox"> Alpha
</label>
<label>
<input type="checkbox"> Beta
</label>
<label>
<input type="checkbox"> Gamma
</label>
<p>Beta</p>`,
test ( assert, component, target, window ) {
const inputs = target.querySelectorAll( 'input' );
assert.equal( inputs[0].checked, false );
assert.equal( inputs[1].checked, true );
assert.equal( inputs[2].checked, false );
const event = new window.Event( 'change' );
inputs[0].checked = true;
inputs[0].dispatchEvent( event );
assert.htmlEqual( target.innerHTML, `
<label>
<input type="checkbox"> Alpha
</label>
<label>
<input type="checkbox"> Beta
</label>
<label>
<input type="checkbox"> Gamma
</label>
<p>Alpha, Beta</p>
` );
component.set({ selected: [ values[1], values[2] ] });
assert.equal( inputs[0].checked, false );
assert.equal( inputs[1].checked, true );
assert.equal( inputs[2].checked, true );
assert.htmlEqual( target.innerHTML, `
<label>
<input type="checkbox"> Alpha
</label>
<label>
<input type="checkbox"> Beta
</label>
<label>
<input type="checkbox"> Gamma
</label>
<p>Beta, Gamma</p>
` );
}
};

@ -0,0 +1,13 @@
<label>
<input type="checkbox" value="{{values[0]}}" bind:group='selected' /> {{values[0].name}}
</label>
<label>
<input type="checkbox" value="{{values[1]}}" bind:group='selected' /> {{values[1].name}}
</label>
<label>
<input type="checkbox" value="{{values[2]}}" bind:group='selected' /> {{values[2].name}}
</label>
<p>{{selected.map( function ( value ) { return value.name; }).join( ', ' ) }}</p>
Loading…
Cancel
Save