diff --git a/src/generators/Generator.js b/src/generators/Generator.js index 37d8de90b6..f1aef70eea 100644 --- a/src/generators/Generator.js +++ b/src/generators/Generator.js @@ -60,14 +60,14 @@ export default class Generator { return alias; } - contextualise ( fragment, expression, isEventHandler ) { + contextualise ( block, expression, isEventHandler ) { this.addSourcemapLocations( expression ); const usedContexts = []; const dependencies = []; const { code, helpers } = this; - const { contextDependencies, contexts, indexes } = fragment; + const { contextDependencies, contexts, indexes } = block; let scope = annotateWithScopes( expression ); diff --git a/src/generators/dom/Block.js b/src/generators/dom/Block.js index 3f5b838bbb..90329c6c21 100644 --- a/src/generators/dom/Block.js +++ b/src/generators/dom/Block.js @@ -39,7 +39,7 @@ export default class Block { `var ${name} = ${renderStatement};` ); - this.createMountStatement( name, parentNode ); + this.mount( name, parentNode ); } else { this.builders.create.addLine( `${this.generator.helper( 'appendNode' )}( ${renderStatement}, ${parentNode} );` ); } @@ -58,7 +58,7 @@ export default class Block { this.addElement( name, renderStatement, parentNode, true ); } - createMountStatement ( name, parentNode ) { + mount ( name, parentNode ) { if ( parentNode ) { this.builders.create.addLine( `${this.generator.helper( 'appendNode' )}( ${name}, ${parentNode} );` ); } else { diff --git a/src/generators/dom/visitors/Element/Attribute.js b/src/generators/dom/visitors/Element/Attribute.js new file mode 100644 index 0000000000..c73bc1973b --- /dev/null +++ b/src/generators/dom/visitors/Element/Attribute.js @@ -0,0 +1,133 @@ +import attributeLookup from './lookup.js'; +import deindent from '../../../../utils/deindent.js'; +import getStaticAttributeValue from './getStaticAttributeValue.js'; + +export default function visitAttribute ( generator, block, state, node, attribute ) { + const name = attribute.name; + + let metadata = state.namespace ? null : attributeLookup[ name ]; + if ( metadata && metadata.appliesTo && !~metadata.appliesTo.indexOf( node.name ) ) metadata = null; + + let dynamic = false; + + const isIndirectlyBoundValue = name === 'value' && ( + node.name === 'option' || // TODO check it's actually bound + node.name === 'input' && /^(checkbox|radio)$/.test( getStaticAttributeValue( node, 'type' ) ) + ); + + const propertyName = isIndirectlyBoundValue ? '__value' : metadata && metadata.propertyName; + + // xlink is a special case... we could maybe extend this to generic + // namespaced attributes but I'm not sure that's applicable in + // HTML5? + const method = name.slice( 0, 6 ) === 'xlink:' ? 'setXlinkAttribute' : 'setAttribute'; + + // attributes without values, e.g.