From 1b92f5fa20098ce487e882599276a24a01e4a9a9 Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Sat, 29 Jul 2017 18:19:04 -0400 Subject: [PATCH] event propagation shorthand for components (#638) --- .../dom/visitors/Component/EventHandler.ts | 33 +++++++++++-------- .../Widget.html | 1 + .../_config.js | 18 ++++++++++ .../main.html | 11 +++++++ 4 files changed, 49 insertions(+), 14 deletions(-) create mode 100644 test/runtime/samples/event-handler-shorthand-component/Widget.html create mode 100644 test/runtime/samples/event-handler-shorthand-component/_config.js create mode 100644 test/runtime/samples/event-handler-shorthand-component/main.html diff --git a/src/generators/dom/visitors/Component/EventHandler.ts b/src/generators/dom/visitors/Component/EventHandler.ts index 1010456253..0abef43821 100644 --- a/src/generators/dom/visitors/Component/EventHandler.ts +++ b/src/generators/dom/visitors/Component/EventHandler.ts @@ -13,22 +13,25 @@ export default function visitEventHandler( local ) { // TODO verify that it's a valid callee (i.e. built-in or declared method) - generator.addSourcemapLocations(attribute.expression); - generator.code.prependRight( - attribute.expression.start, - `${block.alias('component')}.` - ); - const usedContexts: string[] = []; - attribute.expression.arguments.forEach((arg: Node) => { - const { contexts } = block.contextualise(arg, null, true); - contexts.forEach(context => { - if (!~usedContexts.indexOf(context)) usedContexts.push(context); - if (!~local.allUsedContexts.indexOf(context)) - local.allUsedContexts.push(context); + if (attribute.expression) { + generator.addSourcemapLocations(attribute.expression); + generator.code.prependRight( + attribute.expression.start, + `${block.alias('component')}.` + ); + + attribute.expression.arguments.forEach((arg: Node) => { + const { contexts } = block.contextualise(arg, null, true); + + contexts.forEach(context => { + if (!~usedContexts.indexOf(context)) usedContexts.push(context); + if (!~local.allUsedContexts.indexOf(context)) + local.allUsedContexts.push(context); + }); }); - }); + } // TODO hoist event handlers? can do `this.__component.method(...)` const declarations = usedContexts.map(name => { @@ -42,7 +45,9 @@ export default function visitEventHandler( const handlerBody = (declarations.length ? declarations.join('\n') + '\n\n' : '') + - `[✂${attribute.expression.start}-${attribute.expression.end}✂];`; + (attribute.expression ? + `[✂${attribute.expression.start}-${attribute.expression.end}✂];` : + `${block.alias('component')}.fire('${attribute.name}', event);`); local.create.addBlock(deindent` ${local.name}.on( '${attribute.name}', function ( event ) { diff --git a/test/runtime/samples/event-handler-shorthand-component/Widget.html b/test/runtime/samples/event-handler-shorthand-component/Widget.html new file mode 100644 index 0000000000..47e1f95a2f --- /dev/null +++ b/test/runtime/samples/event-handler-shorthand-component/Widget.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/test/runtime/samples/event-handler-shorthand-component/_config.js b/test/runtime/samples/event-handler-shorthand-component/_config.js new file mode 100644 index 0000000000..e0e21f1400 --- /dev/null +++ b/test/runtime/samples/event-handler-shorthand-component/_config.js @@ -0,0 +1,18 @@ +export default { + html: ` + + `, + + test (assert, component, target, window) { + const button = target.querySelector('button'); + const event = new window.MouseEvent('click'); + + let answer; + component.on('foo', event => { + answer = event.answer; + }); + + button.dispatchEvent(event); + assert.equal(answer, 42); + } +}; diff --git a/test/runtime/samples/event-handler-shorthand-component/main.html b/test/runtime/samples/event-handler-shorthand-component/main.html new file mode 100644 index 0000000000..5eb9bbb3eb --- /dev/null +++ b/test/runtime/samples/event-handler-shorthand-component/main.html @@ -0,0 +1,11 @@ + + + \ No newline at end of file