From f7fdb9eb32fa93bbfd3b9e7b4463864daa802ad6 Mon Sep 17 00:00:00 2001 From: Rich-Harris Date: Fri, 24 Feb 2017 21:33:44 -0500 Subject: [PATCH] expose context on components --- src/generators/dom/visitors/Component.js | 30 +++++++++++++++++++ .../attributes/addComponentAttributes.js | 4 +-- 2 files changed, 32 insertions(+), 2 deletions(-) diff --git a/src/generators/dom/visitors/Component.js b/src/generators/dom/visitors/Component.js index 05ea49fad1..46ba6d4aa1 100644 --- a/src/generators/dom/visitors/Component.js +++ b/src/generators/dom/visitors/Component.js @@ -24,6 +24,36 @@ export default { addComponentAttributes( generator, node, local ); + if ( local.allUsedContexts.size ) { + const contextNames = [...local.allUsedContexts]; + + const initialProps = contextNames.map( contextName => { + if ( contextName === 'root' ) return `root: root`; + + const listName = generator.current.listNames[ contextName ]; + const indexName = generator.current.indexNames[ contextName ]; + + return `${listName}: ${listName},\n${indexName}: ${indexName}`; + }).join( ',\n' ); + + const updates = contextNames.map( contextName => { + if ( contextName === 'root' ) return `${name}._context.root = root;`; + + const listName = generator.current.listNames[ contextName ]; + const indexName = generator.current.indexNames[ contextName ]; + + return `${name}._context.${listName} = ${listName};\n${name}._context.${indexName} = ${indexName};`; + }).join( '\n' ); + + local.init.addBlock( deindent` + ${name}._context = { + ${initialProps} + }; + ` ); + + local.update.addBlock( updates ); + } + const componentInitProperties = [ `target: ${!isToplevel ? generator.current.target: 'null'}`, '_root: component._root || component' diff --git a/src/generators/dom/visitors/attributes/addComponentAttributes.js b/src/generators/dom/visitors/attributes/addComponentAttributes.js index e3471c6d37..4b05faffac 100644 --- a/src/generators/dom/visitors/attributes/addComponentAttributes.js +++ b/src/generators/dom/visitors/attributes/addComponentAttributes.js @@ -94,12 +94,12 @@ export default function addComponentAttributes ( generator, node, local ) { // TODO hoist event handlers? can do `this.__component.method(...)` const declarations = [...usedContexts].map( name => { - if ( name === 'root' ) return 'var root = this.__svelte.root;'; + if ( name === 'root' ) return 'var root = this._context.root;'; const listName = generator.current.listNames[ name ]; const indexName = generator.current.indexNames[ name ]; - return `var ${listName} = this.__svelte.${listName}, ${indexName} = this.__svelte.${indexName}, ${name} = ${listName}[${indexName}]`; + return `var ${listName} = this._context.${listName}, ${indexName} = this._context.${indexName}, ${name} = ${listName}[${indexName}]`; }); const handlerBody = ( declarations.length ? declarations.join( '\n' ) + '\n\n' : '' ) + `[✂${attribute.expression.start}-${attribute.expression.end}✂];`;