From 2a48dd9c97cfe87702c1abb02a502a97d5430455 Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Mon, 27 Feb 2017 14:44:13 -0500 Subject: [PATCH 1/4] add (skipped) test for #301 --- .../binding-select-initial-value/_config.js | 29 +++++++++++++++++++ .../binding-select-initial-value/main.html | 9 ++++++ 2 files changed, 38 insertions(+) create mode 100644 test/generator/binding-select-initial-value/_config.js create mode 100644 test/generator/binding-select-initial-value/main.html diff --git a/test/generator/binding-select-initial-value/_config.js b/test/generator/binding-select-initial-value/_config.js new file mode 100644 index 0000000000..b49c1135af --- /dev/null +++ b/test/generator/binding-select-initial-value/_config.js @@ -0,0 +1,29 @@ +export default { + skip: true, // selectedOptions doesn't work in JSDOM??? + + html: ` +

selected: b

+ + + +

selected: b

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

selected: {{selected}}

+ + + +

selected: {{selected}}

\ No newline at end of file From 530277f9f8d335bb30e1864eb0da21d83e3e3477 Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Mon, 27 Feb 2017 17:02:38 -0500 Subject: [PATCH 2/4] set select value after options have been created (#301) --- src/generators/dom/visitors/Element.js | 6 +++++- .../dom/visitors/attributes/binding/index.js | 12 ++++-------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/generators/dom/visitors/Element.js b/src/generators/dom/visitors/Element.js index 6a0a19498c..6e7370a15b 100644 --- a/src/generators/dom/visitors/Element.js +++ b/src/generators/dom/visitors/Element.js @@ -10,7 +10,7 @@ export default { return Component.enter( generator, node ); } - const name = generator.current.getUniqueName( node.name ); + const name = node.localName = generator.current.getUniqueName( node.name ); const local = { name, @@ -111,6 +111,10 @@ export default { return Component.leave( generator, node ); } + if ( generator.current.initialUpdate ) { + generator.current.builders.init.addBlock( generator.current.initialUpdate ); + } + generator.pop(); } }; diff --git a/src/generators/dom/visitors/attributes/binding/index.js b/src/generators/dom/visitors/attributes/binding/index.js index 9e04ee3479..d884765e52 100644 --- a/src/generators/dom/visitors/attributes/binding/index.js +++ b/src/generators/dom/visitors/attributes/binding/index.js @@ -116,7 +116,7 @@ export default function createBinding ( generator, node, attribute, current, loc } ` ); } else { - const updateElement = `${local.name}.${attribute.name} = ${contextual ? attribute.value : `root.${attribute.value}`}`; + const updateElement = `${local.name}.${attribute.name} = ${contextual ? attribute.value : `root.${attribute.value}`};`; generator.uses.addEventListener = true; generator.uses.removeEventListener = true; @@ -130,20 +130,16 @@ export default function createBinding ( generator, node, attribute, current, loc } addEventListener( ${local.name}, '${eventName}', ${handler} ); - ${updateElement}; ` ); + generator.current.initialUpdate = updateElement; + local.update.addLine( - `if ( !${local.name}_updating ) ${updateElement};` + `if ( !${local.name}_updating ) ${updateElement}` ); generator.current.builders.teardown.addLine( deindent` removeEventListener( ${local.name}, '${eventName}', ${handler} ); ` ); } - - if ( node.name === 'select' ) { - generator.hasComplexBindings = true; - local.init.addLine( `component._bindings.push( ${handler} )` ); - } } From 2cb4ca2c8d374a357e394d4a821ebe2708740fa2 Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Mon, 27 Feb 2017 17:28:15 -0500 Subject: [PATCH 3/4] fix #301, even with non-primitive values --- src/generators/dom/visitors/Element.js | 10 +++++--- .../dom/visitors/attributes/binding/index.js | 24 +++++++++++++++++-- 2 files changed, 29 insertions(+), 5 deletions(-) diff --git a/src/generators/dom/visitors/Element.js b/src/generators/dom/visitors/Element.js index 6e7370a15b..57b178b3cf 100644 --- a/src/generators/dom/visitors/Element.js +++ b/src/generators/dom/visitors/Element.js @@ -10,7 +10,7 @@ export default { return Component.enter( generator, node ); } - const name = node.localName = generator.current.getUniqueName( node.name ); + const name = generator.current.getUniqueName( node.name ); const local = { name, @@ -111,8 +111,12 @@ export default { return Component.leave( generator, node ); } - if ( generator.current.initialUpdate ) { - generator.current.builders.init.addBlock( generator.current.initialUpdate ); + if ( node.initialUpdate ) { + console.log( `node.initialUpdate`, node.initialUpdate ) + //generator.current.builders.init.addBlock( node.initialUpdate ); + generator.current.builders.init.addBlock( + `/*HELLO*/` + node.initialUpdate + ); } generator.pop(); diff --git a/src/generators/dom/visitors/attributes/binding/index.js b/src/generators/dom/visitors/attributes/binding/index.js index d884765e52..b45793188c 100644 --- a/src/generators/dom/visitors/attributes/binding/index.js +++ b/src/generators/dom/visitors/attributes/binding/index.js @@ -116,7 +116,27 @@ export default function createBinding ( generator, node, attribute, current, loc } ` ); } else { - const updateElement = `${local.name}.${attribute.name} = ${contextual ? attribute.value : `root.${attribute.value}`};`; + let updateElement; + + if ( node.name === 'select' ) { + // TODO select multiple + const value = generator.current.getUniqueName( 'value' ); + const i = generator.current.getUniqueName( 'i' ); + const option = generator.current.getUniqueName( 'option' ); + + updateElement = deindent` + var ${value} = ${contextual ? attribute.value : `root.${attribute.value}`}; + for ( var ${i} = 0; ${i} < ${local.name}.options.length; ${i} += 1 ) { + var ${option} = ${local.name}.options[${i}]; + if ( ${option}.__value === ${value} ) { + ${option}.selected = true; + break; + } + } + `; + } else { + updateElement = `${local.name}.${attribute.name} = ${contextual ? attribute.value : `root.${attribute.value}`};`; + } generator.uses.addEventListener = true; generator.uses.removeEventListener = true; @@ -132,7 +152,7 @@ export default function createBinding ( generator, node, attribute, current, loc addEventListener( ${local.name}, '${eventName}', ${handler} ); ` ); - generator.current.initialUpdate = updateElement; + node.initialUpdate = updateElement; local.update.addLine( `if ( !${local.name}_updating ) ${updateElement}` From f3175683e5d45556f4e568d1f18bca44a350f9de Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Mon, 27 Feb 2017 17:29:08 -0500 Subject: [PATCH 4/4] tidy up --- src/generators/dom/visitors/Element.js | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/generators/dom/visitors/Element.js b/src/generators/dom/visitors/Element.js index 57b178b3cf..b200b9710c 100644 --- a/src/generators/dom/visitors/Element.js +++ b/src/generators/dom/visitors/Element.js @@ -112,11 +112,7 @@ export default { } if ( node.initialUpdate ) { - console.log( `node.initialUpdate`, node.initialUpdate ) - //generator.current.builders.init.addBlock( node.initialUpdate ); - generator.current.builders.init.addBlock( - `/*HELLO*/` + node.initialUpdate - ); + generator.current.builders.init.addBlock( node.initialUpdate ); } generator.pop();