better solution for preventing blowback with inter-component bindings, also fixes #19

pull/31/head
Rich-Harris 8 years ago
parent 20bf76b578
commit 7736866397

@ -260,13 +260,9 @@ export default function generate ( parsed, source, options ) {
}
setStatements.push( deindent`
if ( setting ) return;
setting = true;
dispatchObservers( observers.immediate, newState, oldState );
if ( mainFragment ) mainFragment.update( newState, state );
dispatchObservers( observers.deferred, newState, oldState );
setting = false;
` );
const topLevelStatements = [];

@ -74,18 +74,24 @@ export default function createBinding ( generator, node, attribute, current, loc
}
if ( local.isComponent ) {
generator.hasComplexBindings = true;
local.init.push( deindent`
var ${local.name}_updating = false;
${local.name}.observe( '${attribute.name}', function ( value ) {
${local.name}_updating = true;
${setter}
${local.name}_updating = false;
component.__bindings.push( function () {
${local.name}.observe( '${attribute.name}', function ( value ) {
${local.name}_updating = true;
${setter}
${local.name}_updating = false;
});
});
` );
local.update.push( deindent`
if ( !${local.name}_updating ) ${local.name}.set({ ${attribute.name}: ${contextual ? attribute.value : `root.${attribute.value}`} });
if ( !${local.name}_updating && '${parts[0]}' in changed ) {
${local.name}.set({ ${attribute.name}: ${contextual ? attribute.value : `root.${attribute.value}`} });
}
` );
} else {
local.init.push( deindent`

@ -0,0 +1,9 @@
<button on:click='set({ count: count + 1 })'>+1</button>
<script>
export default {
data: () => ({
count: 0
})
};
</script>

@ -0,0 +1,27 @@
export default {
html: `
<button>+1</button>
<p>count: 10</p>
`,
test ( assert, component, target, window ) {
const click = new window.MouseEvent( 'click' );
const button = target.querySelector( 'button' );
button.dispatchEvent( click );
assert.equal( component.get( 'x' ), 11 );
assert.htmlEqual( target.innerHTML, `
<button>+1</button>
<p>count: 11</p>
` );
button.dispatchEvent( click );
assert.equal( component.get( 'x' ), 12 );
assert.htmlEqual( target.innerHTML, `
<button>+1</button>
<p>count: 12</p>
` );
}
};

@ -0,0 +1,16 @@
<Counter bind:count='x'/>
<p>count: {{x}}</p>
<script>
import Counter from './Counter.html';
export default {
data: () => ({
x: 10
}),
components: {
Counter
}
};
</script>
Loading…
Cancel
Save