pull/922/head
Rich Harris 8 years ago
parent aa96812713
commit 75d29faf25

@ -102,20 +102,9 @@ export default function addBindings(
}); });
// view to model // view to model
// TODO tidy this up const valueFromDom = getValueFromDom(generator, node, binding);
const valueFromDom = getBindingValue(
generator,
block,
node._state,
node,
binding,
node.name === 'select' && getStaticAttributeValue(node, 'multiple') === true,
isMediaNode(node.name),
binding.name === 'group' ? getBindingGroup(generator, binding.value) : null,
getStaticAttributeValue(node, 'type')
);
const viewToModel = getViewToModel( const handler = getEventHandler(
generator, generator,
block, block,
name, name,
@ -127,9 +116,8 @@ export default function addBindings(
); );
// model to view // model to view
let modelToView = getModelToView(node, binding, snippet); let updateDom = getDomUpdater(node, binding, snippet);
let initialUpdate = modelToView; let initialUpdate = updateDom;
// block.builders.update.addLine(modelToView);
// special cases // special cases
if (binding.name === 'group') { if (binding.name === 'group') {
@ -155,15 +143,15 @@ export default function addBindings(
block.addVariable(last, 'true'); block.addVariable(last, 'true');
updateCondition = `${last} !== (${last} = ${snippet})`; updateCondition = `${last} !== (${last} = ${snippet})`;
modelToView = `${node.var}[${last} ? "pause" : "play"]();`; updateDom = `${node.var}[${last} ? "pause" : "play"]();`;
initialUpdate = null; initialUpdate = null;
} }
return { return {
name: binding.name, name: binding.name,
object: name, object: name,
viewToModel, handler,
modelToView, updateDom,
initialUpdate, initialUpdate,
needsLock: !isReadOnly && needsLock, needsLock: !isReadOnly && needsLock,
updateCondition updateCondition
@ -191,23 +179,23 @@ export default function addBindings(
const needsLock = group.bindings.some(binding => binding.needsLock); const needsLock = group.bindings.some(binding => binding.needsLock);
group.bindings.forEach(binding => { group.bindings.forEach(binding => {
if (!binding.modelToView) return; if (!binding.updateDom) return;
const updateConditions = needsLock ? [`!${lock}`] : []; const updateConditions = needsLock ? [`!${lock}`] : [];
if (binding.updateCondition) updateConditions.push(binding.updateCondition); if (binding.updateCondition) updateConditions.push(binding.updateCondition);
block.builders.update.addLine( block.builders.update.addLine(
updateConditions.length ? `if (${updateConditions.join(' && ')}) ${binding.modelToView}` : binding.modelToView updateConditions.length ? `if (${updateConditions.join(' && ')}) ${binding.updateDom}` : binding.updateDom
); );
}); });
const usesContext = group.bindings.some(binding => binding.viewToModel.usesContext); const usesContext = group.bindings.some(binding => binding.handler.usesContext);
const usesState = group.bindings.some(binding => binding.viewToModel.usesState); const usesState = group.bindings.some(binding => binding.handler.usesState);
const mutations = group.bindings.map(binding => binding.viewToModel.mutation).filter(Boolean).join('\n'); const mutations = group.bindings.map(binding => binding.handler.mutation).filter(Boolean).join('\n');
const props = new Set(); const props = new Set();
group.bindings.forEach(binding => { group.bindings.forEach(binding => {
binding.viewToModel.props.forEach(prop => { binding.handler.props.forEach(prop => {
props.add(prop); props.add(prop);
}); });
}); // TODO use stringifyProps here, once indenting is fixed }); // TODO use stringifyProps here, once indenting is fixed
@ -263,7 +251,7 @@ export default function addBindings(
node.initialUpdate = mungedBindings.map(binding => binding.initialUpdate).filter(Boolean).join('\n'); node.initialUpdate = mungedBindings.map(binding => binding.initialUpdate).filter(Boolean).join('\n');
} }
function getModelToView( function getDomUpdater(
node: Node, node: Node,
binding: Node, binding: Node,
snippet: string snippet: string
@ -306,7 +294,7 @@ function getBindingGroup(generator: DomGenerator, value: Node) {
return index; return index;
} }
function getViewToModel( function getEventHandler(
generator: DomGenerator, generator: DomGenerator,
block: Block, block: Block,
name: string, name: string,
@ -358,31 +346,23 @@ function getViewToModel(
}; };
} }
function getBindingValue( function getValueFromDom(
generator: DomGenerator, generator: DomGenerator,
block: Block,
state: State,
node: Node, node: Node,
attribute: Node, binding: Node
isMultipleSelect: boolean,
isMediaElement: boolean,
bindingGroup: number,
type: string
) { ) {
// <select multiple bind:value='selected>
if (isMultipleSelect) {
return `@selectMultipleValue(${node.var})`;
// return `[].map.call(${node.var}.querySelectorAll(':checked'), function(option) { return option.__value; })`;
}
// <select bind:value='selected> // <select bind:value='selected>
if (node.name === 'select') { if (node.name === 'select') {
// return 'selectedOption && selectedOption.__value'; return getStaticAttributeValue(node, 'multiple') === true ?
return `@selectValue(${node.var})`; `@selectMultipleValue(${node.var})` :
`@selectValue(${node.var})`;
} }
const type = getStaticAttributeValue(node, 'type');
// <input type='checkbox' bind:group='foo'> // <input type='checkbox' bind:group='foo'>
if (attribute.name === 'group') { if (binding.name === 'group') {
const bindingGroup = getBindingGroup(generator, binding.value);
if (type === 'checkbox') { if (type === 'checkbox') {
return `@getBindingGroupValue(#component._bindingGroups[${bindingGroup}])`; return `@getBindingGroupValue(#component._bindingGroups[${bindingGroup}])`;
} }
@ -392,15 +372,15 @@ function getBindingValue(
// <input type='range|number' bind:value> // <input type='range|number' bind:value>
if (type === 'range' || type === 'number') { if (type === 'range' || type === 'number') {
return `@toNumber(${node.var}.${attribute.name})`; return `@toNumber(${node.var}.${binding.name})`;
} }
if (isMediaElement && (attribute.name === 'buffered' || attribute.name === 'seekable' || attribute.name === 'played')) { if ((binding.name === 'buffered' || binding.name === 'seekable' || binding.name === 'played')) {
return `@timeRangesToArray(${node.var}.${attribute.name})` return `@timeRangesToArray(${node.var}.${binding.name})`
} }
// everything else // everything else
return `${node.var}.${attribute.name}`; return `${node.var}.${binding.name}`;
} }
function isComputed(node: Node) { function isComputed(node: Node) {

Loading…
Cancel
Save