fix special props on `<select>` elements (#590)

When visiting `<select>` elements, don't try to add props until after
the (delayed) visiting of the attributes, as that's when we determine
what the props should be.
pull/591/head
Conduitry 8 years ago
parent 4e58bd06ff
commit 228417e1dc

@ -46,7 +46,7 @@ export default function visitElement ( generator, block, state, node ) {
block.builders.create.addLine( `${generator.helper( 'setAttribute' )}( ${name}, '${generator.cssId}', '' );` );
}
function visitAttributes () {
function visitAttributesAndAddProps () {
let intro;
let outro;
@ -63,25 +63,6 @@ export default function visitElement ( generator, block, state, node ) {
});
if ( intro || outro ) addTransitions( generator, block, childState, node, intro, outro );
}
if ( !state.parentNode ) {
// TODO we eventually need to consider what happens to elements
// that belong to the same outgroup as an outroing element...
block.builders.detach.addLine( `${generator.helper( 'detachNode' )}( ${name} );` );
}
if ( node.name !== 'select' ) {
// <select> value attributes are an annoying special case — it must be handled
// *after* its children have been updated
visitAttributes();
}
// special case bound <option> without a value attribute
if ( node.name === 'option' && !node.attributes.find( attribute => attribute.type === 'Attribute' && attribute.name === 'value' ) ) { // TODO check it's bound
const statement = `${name}.__value = ${name}.textContent;`;
node.initialUpdate = node.lateUpdate = statement;
}
if ( childState.allUsedContexts.length || childState.usesComponent ) {
const initialProps = [];
@ -113,6 +94,25 @@ export default function visitElement ( generator, block, state, node ) {
block.builders.update.addBlock( updates.join( '\n' ) );
}
}
}
if ( !state.parentNode ) {
// TODO we eventually need to consider what happens to elements
// that belong to the same outgroup as an outroing element...
block.builders.detach.addLine( `${generator.helper( 'detachNode' )}( ${name} );` );
}
if ( node.name !== 'select' ) {
// <select> value attributes are an annoying special case — it must be handled
// *after* its children have been updated
visitAttributesAndAddProps();
}
// special case bound <option> without a value attribute
if ( node.name === 'option' && !node.attributes.find( attribute => attribute.type === 'Attribute' && attribute.name === 'value' ) ) { // TODO check it's bound
const statement = `${name}.__value = ${name}.textContent;`;
node.initialUpdate = node.lateUpdate = statement;
}
node.children.forEach( child => {
visit( generator, block, childState, child );
@ -123,7 +123,7 @@ export default function visitElement ( generator, block, state, node ) {
}
if ( node.name === 'select' ) {
visitAttributes();
visitAttributesAndAddProps();
}
if ( node.initialUpdate ) {

Loading…
Cancel
Save