From f50a3ec931f1f255a788913af69861fc7a7d84d1 Mon Sep 17 00:00:00 2001 From: Rich-Harris Date: Tue, 7 Mar 2017 23:48:18 -0500 Subject: [PATCH 1/2] remove a console.log that slipped in somehow --- src/generators/dom/visitors/attributes/binding/index.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/generators/dom/visitors/attributes/binding/index.js b/src/generators/dom/visitors/attributes/binding/index.js index c2d579e254..7188551f44 100644 --- a/src/generators/dom/visitors/attributes/binding/index.js +++ b/src/generators/dom/visitors/attributes/binding/index.js @@ -151,7 +151,6 @@ export default function createBinding ( generator, node, attribute, current, loc updateElement = deindent` var ${value} = ${contextual ? attribute.value : `root.${attribute.value}`}; - console.log( 'value', ${value} ); for ( var ${i} = 0; ${i} < ${local.name}.options.length; ${i} += 1 ) { var ${option} = ${local.name}.options[${i}]; From 38cd0515433a7bf7c7dcf601ae610c6282fd0f3b Mon Sep 17 00:00:00 2001 From: Rich-Harris Date: Wed, 8 Mar 2017 12:04:27 -0500 Subject: [PATCH 2/2] fix two-way binding for components inside each-blocks - closes #356 --- .../dom/visitors/attributes/binding/index.js | 4 +++- .../visitors/Component.js | 5 ++++ .../component-binding-each-object/Widget.html | 1 + .../component-binding-each-object/_config.js | 24 +++++++++++++++++++ .../component-binding-each-object/main.html | 13 ++++++++++ 5 files changed, 46 insertions(+), 1 deletion(-) create mode 100644 test/generator/samples/component-binding-each-object/Widget.html create mode 100644 test/generator/samples/component-binding-each-object/_config.js create mode 100644 test/generator/samples/component-binding-each-object/main.html diff --git a/src/generators/dom/visitors/attributes/binding/index.js b/src/generators/dom/visitors/attributes/binding/index.js index 7188551f44..2425aaaad7 100644 --- a/src/generators/dom/visitors/attributes/binding/index.js +++ b/src/generators/dom/visitors/attributes/binding/index.js @@ -127,8 +127,10 @@ export default function createBinding ( generator, node, attribute, current, loc }); ` ); + const dependencies = parts[0] in current.contexts ? current.contextDependencies[ parts[0] ] : [ parts[0] ]; + local.update.addBlock( deindent` - if ( !${local.name}_updating && '${parts[0]}' in changed ) { + if ( !${local.name}_updating && ${dependencies.map( dependency => `'${dependency}' in changed` ).join( '||' )} ) { ${local.name}._set({ ${attribute.name}: ${contextual ? attribute.value : `root.${attribute.value}`} }); } ` ); diff --git a/src/generators/server-side-rendering/visitors/Component.js b/src/generators/server-side-rendering/visitors/Component.js index b736af3998..c44d58fe51 100644 --- a/src/generators/server-side-rendering/visitors/Component.js +++ b/src/generators/server-side-rendering/visitors/Component.js @@ -41,6 +41,11 @@ export default { return `${attribute.name}: ${value}`; }) + .concat( bindings.map( binding => { + const parts = binding.value.split( '.' ); + const value = parts[0] in generator.current.contexts ? binding.value : `root.${binding.value}`; + return `${binding.name}: ${value}`; + })) .join( ', ' ); const expression = node.name === ':Self' ? generator.name : `template.components.${node.name}`; diff --git a/test/generator/samples/component-binding-each-object/Widget.html b/test/generator/samples/component-binding-each-object/Widget.html new file mode 100644 index 0000000000..bba644f351 --- /dev/null +++ b/test/generator/samples/component-binding-each-object/Widget.html @@ -0,0 +1 @@ +{{value.id}} \ No newline at end of file diff --git a/test/generator/samples/component-binding-each-object/_config.js b/test/generator/samples/component-binding-each-object/_config.js new file mode 100644 index 0000000000..0802361f3d --- /dev/null +++ b/test/generator/samples/component-binding-each-object/_config.js @@ -0,0 +1,24 @@ +export default { + data: { + a: [{ id: 'foo' }, { id: 'bar' }, { id: 'baz' }] + }, + + html: ` + foobarbaz + `, + + test ( assert, component, target ) { + component.set({ + a: [ + { id: 'yep' }, + { id: 'nope' } + ] + }); + + assert.htmlEqual( target.innerHTML, ` + yepnope + ` ); + + component.destroy(); + } +}; diff --git a/test/generator/samples/component-binding-each-object/main.html b/test/generator/samples/component-binding-each-object/main.html new file mode 100644 index 0000000000..d378fcf833 --- /dev/null +++ b/test/generator/samples/component-binding-each-object/main.html @@ -0,0 +1,13 @@ +{{#each a as x}} + +{{/each}} + +