From 0a806585b359314011b5b26ee191a1693986fdf0 Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Mon, 24 Jul 2017 14:58:27 -0400 Subject: [PATCH] enforce order of operations --- src/generators/dom/index.ts | 12 +++++++++--- .../dom/visitors/shared/binding/getSetter.ts | 8 ++++---- src/shared/index.js | 3 +++ 3 files changed, 16 insertions(+), 7 deletions(-) diff --git a/src/generators/dom/index.ts b/src/generators/dom/index.ts index de59578f31..c29be14bcc 100644 --- a/src/generators/dom/index.ts +++ b/src/generators/dom/index.ts @@ -235,9 +235,15 @@ export default function dom( this._fragment.${block.hasIntroMethod ? 'intro' : 'mount'}( options.target, null ); } - ${(generator.hasComponents || generator.hasComplexBindings) && `@callAll(this._beforecreate);`} - ${(generator.hasComponents || templateProperties.oncreate) && `@callAll(this._oncreate);`} - ${(generator.hasComponents || generator.hasIntroTransitions) && `@callAll(this._aftercreate);`} + ${(generator.hasComponents || generator.hasComplexBindings || templateProperties.oncreate || generator.hasIntroTransitions) && deindent` + if ( !options._root ) { + ${generator.hasComponents && `this._block = true;`} + ${(generator.hasComponents || generator.hasComplexBindings) && `@callAll(this._beforecreate);`} + ${(generator.hasComponents || templateProperties.oncreate) && `@callAll(this._oncreate);`} + ${(generator.hasComponents || generator.hasIntroTransitions) && `@callAll(this._aftercreate);`} + ${generator.hasComponents && `this._block = false;`} + } + `} } @assign( ${prototypeBase}, ${proto}); diff --git a/src/generators/dom/visitors/shared/binding/getSetter.ts b/src/generators/dom/visitors/shared/binding/getSetter.ts index 784e1d7302..6c25d67a72 100644 --- a/src/generators/dom/visitors/shared/binding/getSetter.ts +++ b/src/generators/dom/visitors/shared/binding/getSetter.ts @@ -27,10 +27,10 @@ export default function getSetter({ list[index]${tail} = ${value}; ${computed - ? `#component._set({ ${dependencies + ? `#component.set({ ${dependencies .map((prop: string) => `${prop}: state.${prop}`) .join(', ')} });` - : `#component._set({ ${dependencies + : `#component.set({ ${dependencies .map((prop: string) => `${prop}: #component.get( '${prop}' )`) .join(', ')} });`} `; @@ -40,13 +40,13 @@ export default function getSetter({ return deindent` var state = #component.get(); ${snippet} = ${value}; - #component._set({ ${dependencies + #component.set({ ${dependencies .map((prop: string) => `${prop}: state.${prop}`) .join(', ')} }); `; } - return `#component._set({ ${name}: ${value} });`; + return `#component.set({ ${name}: ${value} });`; } function isComputed(node: Node) { diff --git a/src/shared/index.js b/src/shared/index.js index 35d5fe8c96..0a671d2320 100644 --- a/src/shared/index.js +++ b/src/shared/index.js @@ -106,9 +106,12 @@ export function onDev(eventName, handler) { export function set(newState) { this._set(assign({}, newState)); + if (this._root._block) return; + this._root._block = true; callAll(this._root._beforecreate); callAll(this._root._oncreate); callAll(this._root._aftercreate); + this._root._block = false; } export function callAll(fns) {