diff --git a/src/generators/dom/visitors/Element/Binding.ts b/src/generators/dom/visitors/Element/Binding.ts index 37482f19864a..4979340b4f4a 100644 --- a/src/generators/dom/visitors/Element/Binding.ts +++ b/src/generators/dom/visitors/Element/Binding.ts @@ -7,6 +7,7 @@ import Block from '../../Block'; import { Node } from '../../../../interfaces'; import { State } from '../../interfaces'; import getObject from '../../../../utils/getObject'; +import getTailSnippet from '../../../../utils/getTailSnippet'; export default function visitBinding( generator: DomGenerator, @@ -83,8 +84,11 @@ export default function visitBinding( break; }`; + const { name } = getObject(attribute.value); + const tailSnippet = getTailSnippet(attribute.value); + updateElement = deindent` - var ${value} = ${snippet}; + var ${value} = #component.get( '${name}' )${tailSnippet}; for ( var #i = 0; #i < ${state.parentNode}.options.length; #i += 1 ) { var ${option} = ${state.parentNode}.options[#i]; diff --git a/test/runtime/samples/binding-select-in-yield/Modal.html b/test/runtime/samples/binding-select-in-yield/Modal.html new file mode 100644 index 000000000000..53ec5fb2cb74 --- /dev/null +++ b/test/runtime/samples/binding-select-in-yield/Modal.html @@ -0,0 +1,20 @@ +{{#if !hidden}} + {{ yield }} +{{/if}} + + \ No newline at end of file diff --git a/test/runtime/samples/binding-select-in-yield/_config.js b/test/runtime/samples/binding-select-in-yield/_config.js new file mode 100644 index 000000000000..4ff851d33f8f --- /dev/null +++ b/test/runtime/samples/binding-select-in-yield/_config.js @@ -0,0 +1,63 @@ +export default { + html: ``, + + data: { + letter: 'b' + }, + + test ( assert, component, target, window ) { + component.refs.modal.toggle(); + + assert.htmlEqual(target.innerHTML, ` + b + + + `); + + const select = target.querySelector('select'); + const change = new window.MouseEvent('change'); + + select.options[2].selected = true; + select.dispatchEvent(change); + assert.equal(component.get('letter'), 'c'); + + assert.deepEqual(Array.from(select.options).map(o => o.selected), [ + false, + false, + true + ]); + + assert.htmlEqual(target.innerHTML, ` + c + + + `); + + component.refs.modal.toggle(); + component.refs.modal.toggle(); + + assert.deepEqual(Array.from(select.options).map(o => o.selected), [ + false, + false, + true + ]); + + assert.htmlEqual(target.innerHTML, ` + c + + + `); + } +}; diff --git a/test/runtime/samples/binding-select-in-yield/main.html b/test/runtime/samples/binding-select-in-yield/main.html new file mode 100644 index 000000000000..6ed86dc2884b --- /dev/null +++ b/test/runtime/samples/binding-select-in-yield/main.html @@ -0,0 +1,23 @@ + + {{letter}} + + + + \ No newline at end of file