diff --git a/src/generators/dom/visitors/Element/Binding.ts b/src/generators/dom/visitors/Element/Binding.ts index 9ea9dcb54114..b190230527cd 100644 --- a/src/generators/dom/visitors/Element/Binding.ts +++ b/src/generators/dom/visitors/Element/Binding.ts @@ -89,6 +89,11 @@ export default function visitBinding( ${ifStatement} } `; + + generator.hasComplexBindings = true; + block.builders.create.addBlock( + `if ( !('${name}' in state) ) ${block.component}._bindings.push( ${handler} );` + ); } else if (attribute.name === 'group') { // special case if (type === 'radio') { diff --git a/test/runtime/samples/binding-select-initial-value-undefined/_config.js b/test/runtime/samples/binding-select-initial-value-undefined/_config.js new file mode 100644 index 000000000000..d5944ae81598 --- /dev/null +++ b/test/runtime/samples/binding-select-initial-value-undefined/_config.js @@ -0,0 +1,25 @@ +export default { + 'skip-ssr': true, // TODO would be nice to fix this in SSR as well + + html: ` +

selected: a

+ + + +

selected: a

+ `, + + test ( assert, component, target ) { + const select = target.querySelector( 'select' ); + const options = [ ...target.querySelectorAll( 'option' ) ]; + + assert.equal( select.value, 'a' ); + assert.ok( options[0].selected ); + + component.destroy(); + } +}; diff --git a/test/runtime/samples/binding-select-initial-value-undefined/main.html b/test/runtime/samples/binding-select-initial-value-undefined/main.html new file mode 100644 index 000000000000..ea154022401e --- /dev/null +++ b/test/runtime/samples/binding-select-initial-value-undefined/main.html @@ -0,0 +1,9 @@ +

selected: {{selected}}

+ + + +

selected: {{selected}}

\ No newline at end of file