From 82cc81b183728e644c1e241ff2acecfb770452aa Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Wed, 6 Jun 2018 17:23:35 -0400 Subject: [PATCH] fix the bugs --- src/compile/dom/Block.ts | 31 ++++++++++++++++++++----------- src/compile/nodes/Attribute.ts | 4 ++-- src/compile/nodes/Title.ts | 2 +- src/compile/nodes/shared/Tag.ts | 2 +- 4 files changed, 24 insertions(+), 15 deletions(-) diff --git a/src/compile/dom/Block.ts b/src/compile/dom/Block.ts index 0b16d1502a..977486bd8d 100644 --- a/src/compile/dom/Block.ts +++ b/src/compile/dom/Block.ts @@ -142,6 +142,10 @@ export default class Block { } addVariable(name: string, init?: string) { + if (name[0] === '#') { + name = this.alias(name.slice(1)); + } + if (this.variables.has(name) && this.variables.get(name) !== init) { throw new Error( `Variable '${name}' already initialised with a different value` @@ -166,11 +170,16 @@ export default class Block { toString() { const { dev } = this.compiler.options; - let current; if (this.hasIntroMethod || this.hasOutroMethod) { - current = this.getUniqueName('current'); - this.addVariable(current); - this.builders.mount.addLine(`${current} = true;`); + this.addVariable('#current'); + + if (!this.builders.mount.isEmpty()) { + this.builders.mount.addLine(`#current = true;`); + } + + if (!this.builders.outro.isEmpty()) { + this.builders.outro.addLine(`#current = false;`); + } } if (this.autofocus) { @@ -268,24 +277,24 @@ export default class Block { } if (this.hasIntroMethod || this.hasOutroMethod) { - if (this.builders.mount.isEmpty() && this.builders.outro.isEmpty()) { + if (this.builders.mount.isEmpty()) { properties.addBlock(`i: @noop,`); - properties.addBlock(`o: @run,`); } else { properties.addBlock(deindent` ${dev ? 'i: function intro' : 'i'}(#target, anchor) { - console.trace("intro", #component.constructor.name, ${current}); - if (${current}) return; + if (#current) return; ${this.builders.intro} this.m(#target, anchor); }, `); + } + if (this.builders.outro.isEmpty()) { + properties.addBlock(`o: @run,`); + } else { properties.addBlock(deindent` ${dev ? 'o: function outro' : 'o'}(#outrocallback) { - console.trace("outro", #component.constructor.name, ${current}); - if (!${current}) return; - ${current} = false; + if (!#current) return; ${this.outros > 1 && `#outrocallback = @callAfter(#outrocallback, ${this.outros});`} diff --git a/src/compile/nodes/Attribute.ts b/src/compile/nodes/Attribute.ts index ac1cbeda6c..53996469e9 100644 --- a/src/compile/nodes/Attribute.ts +++ b/src/compile/nodes/Attribute.ts @@ -232,7 +232,7 @@ export default class Attribute extends Node { if (this.dependencies.size || isSelectValueAttribute) { const dependencies = Array.from(this.dependencies); const changedCheck = ( - ( block.hasOutros ? `#outroing || ` : '' ) + + (block.hasOutros ? `!#current || ` : '') + dependencies.map(dependency => `changed.${dependency}`).join(' || ') ); @@ -308,7 +308,7 @@ export default class Attribute extends Node { if (propDependencies.size) { const dependencies = Array.from(propDependencies); const condition = ( - (block.hasOutros ? `#outroing || ` : '') + + (block.hasOutros ? `!#current || ` : '') + dependencies.map(dependency => `changed.${dependency}`).join(' || ') ); diff --git a/src/compile/nodes/Title.ts b/src/compile/nodes/Title.ts index 8be46bd53b..080d122535 100644 --- a/src/compile/nodes/Title.ts +++ b/src/compile/nodes/Title.ts @@ -81,7 +81,7 @@ export default class Title extends Node { if (allDependencies.size) { const dependencies = Array.from(allDependencies); const changedCheck = ( - ( block.hasOutros ? `#outroing || ` : '' ) + + ( block.hasOutros ? `!#current || ` : '' ) + dependencies.map(dependency => `changed.${dependency}`).join(' || ') ); diff --git a/src/compile/nodes/shared/Tag.ts b/src/compile/nodes/shared/Tag.ts index 82b7123798..df17a1f9c0 100644 --- a/src/compile/nodes/shared/Tag.ts +++ b/src/compile/nodes/shared/Tag.ts @@ -35,7 +35,7 @@ export default class Tag extends Node { if (dependencies.size) { const changedCheck = ( - (block.hasOutros ? `#outroing || ` : '') + + (block.hasOutros ? `!#current || ` : '') + [...dependencies].map((dependency: string) => `changed.${dependency}`).join(' || ') );