From 574503d1010dd4f34f10295c4dec27d1716b429a Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Fri, 17 Mar 2017 12:12:00 -0400 Subject: [PATCH] tidy up --- .../visitors/attributes/addElementBinding.js | 28 +++++++++++-------- 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/src/generators/dom/visitors/attributes/addElementBinding.js b/src/generators/dom/visitors/attributes/addElementBinding.js index 5ec144d085..2965774c6c 100644 --- a/src/generators/dom/visitors/attributes/addElementBinding.js +++ b/src/generators/dom/visitors/attributes/addElementBinding.js @@ -2,33 +2,31 @@ import deindent from '../../../../utils/deindent.js'; import flattenReference from '../../../../utils/flattenReference.js'; export default function createBinding ( generator, node, attribute, current, local ) { - const { name, parts } = flattenReference( attribute.value ); + const { name } = flattenReference( attribute.value ); const { snippet, contexts, dependencies } = generator.contextualise( attribute.value ); - if ( dependencies.length > 1 ) throw new Error( 'An unexpected situation arose. Please raise an issue!' ); + if ( dependencies.length > 1 ) throw new Error( 'An unexpected situation arose. Please raise an issue at https://github.com/sveltejs/svelte/issues — thanks!' ); contexts.forEach( context => { if ( !~local.allUsedContexts.indexOf( context ) ) local.allUsedContexts.push( context ); }); const handler = current.getUniqueName( `${local.name}ChangeHandler` ); - let setter; const isMultipleSelect = node.name === 'select' && node.attributes.find( attr => attr.name.toLowerCase() === 'multiple' ); // TODO ensure that this is a static attribute const value = getBindingValue( local, node, attribute, isMultipleSelect ); const eventName = getBindingEventName( node ); + let setter; + if ( name in current.contexts ) { - // find the top-level property that this is a child of const prop = dependencies[0]; - - const listName = current.listNames[ name ]; - const indexName = current.indexNames[ name ]; + const tail = attribute.value.type === 'MemberExpression' ? getTailSnippet( attribute.value ) : ''; setter = deindent` - var list = this.__svelte.${listName}; - var index = this.__svelte.${indexName}; - list[index]${parts.slice( 1 ).map( part => `.${part}` ).join( '' )} = ${value}; + var list = this.__svelte.${current.listNames[ name ]}; + var index = this.__svelte.${current.indexNames[ name ]}; + list[index]${tail} = ${value}; component._set({ ${prop}: component.get( '${prop}' ) }); `; @@ -42,8 +40,6 @@ export default function createBinding ( generator, node, attribute, current, loc } else { setter = `component._set({ ${name}: ${value} });`; } - - generator.expectedProperties[ name ] = true; } // special case @@ -129,4 +125,12 @@ function getBindingValue ( local, node, attribute, isMultipleSelect ) { } return `${local.name}.${attribute.name}`; +} + +function getTailSnippet ( node ) { + const end = node.end; + while ( node.type === 'MemberExpression' ) node = node.object; + const start = node.end; + + return `[✂${start}-${end}✂]`; } \ No newline at end of file