From 73321465c126a44a515a2be89b098e270dade668 Mon Sep 17 00:00:00 2001 From: Maxim Matyunin Date: Sun, 4 Aug 2019 20:49:35 +0900 Subject: [PATCH] on:* --- src/compiler/compile/nodes/EventHandler.ts | 2 +- src/compiler/compile/render_dom/Block.ts | 15 +++++++++++++++ .../wrappers/shared/add_event_handlers.ts | 6 ++++++ src/runtime/internal/Component.ts | 10 ++++++++++ 4 files changed, 32 insertions(+), 1 deletion(-) diff --git a/src/compiler/compile/nodes/EventHandler.ts b/src/compiler/compile/nodes/EventHandler.ts index 0c65e463ba..0f9ff0dfd9 100644 --- a/src/compiler/compile/nodes/EventHandler.ts +++ b/src/compiler/compile/nodes/EventHandler.ts @@ -17,7 +17,7 @@ export default class EventHandler extends Node { constructor(component: Component, parent, template_scope, info) { super(component, parent, template_scope, info); - this.name = info.name; + this.name = info.name !== '*' ? info.name : 'any'; this.modifiers = new Set(info.modifiers); if (info.expression) { diff --git a/src/compiler/compile/render_dom/Block.ts b/src/compiler/compile/render_dom/Block.ts index 59beae1a39..a9a0eee8c7 100644 --- a/src/compiler/compile/render_dom/Block.ts +++ b/src/compiler/compile/render_dom/Block.ts @@ -45,6 +45,7 @@ export default class Block { }; event_listeners: string[] = []; + any_event_elements: string[] = []; maintain_context: boolean; has_animation: boolean; @@ -325,6 +326,20 @@ export default class Block { `); } + if (this.variables.size > 0) { + const listens = Array.from(this.variables.keys()) + .filter(key => this.any_event_elements.includes(key)) + .join(', '); + + if (listens.length > 0) { + properties.add_block(deindent` + ${method_name('bbl', 'bubble')}() { + return [listen, [${listens}]]; + }, + `); + } + } + if (this.has_intro_method || this.has_outro_method) { if (this.builders.intro.is_empty()) { properties.add_line(`i: @noop,`); diff --git a/src/compiler/compile/render_dom/wrappers/shared/add_event_handlers.ts b/src/compiler/compile/render_dom/wrappers/shared/add_event_handlers.ts index 6b7e62d212..9cc24836af 100644 --- a/src/compiler/compile/render_dom/wrappers/shared/add_event_handlers.ts +++ b/src/compiler/compile/render_dom/wrappers/shared/add_event_handlers.ts @@ -21,6 +21,12 @@ export default function add_event_handlers( block.event_listeners.push( `@listen(${target}, "${handler.name}", ${snippet}, ${opts_string})` ); + } else if (handler.name === 'any') { + block.any_event_elements.push(target); + // This isn't required but listen is treeshaken otherwise + block.event_listeners.push( + `@listen(${target}, "${handler.name}", ${snippet})` + ); } else { block.event_listeners.push( `@listen(${target}, "${handler.name}", ${snippet})` diff --git a/src/runtime/internal/Component.ts b/src/runtime/internal/Component.ts index 92e227e57c..79d89c2428 100644 --- a/src/runtime/internal/Component.ts +++ b/src/runtime/internal/Component.ts @@ -43,6 +43,16 @@ export function mount_component(component, target, anchor) { run_all(new_on_destroy); } component.$$.on_mount = []; + + if (fragment.bbl) { + Object.keys(component.$$.callbacks).forEach(type => { + if (!component.$$.ctx[`${type}_handler`]) { + const [listen, els] = fragment.bbl(); + + els.forEach(el => component.$$.callbacks[type].forEach(cb => listen(el, type, cb))); + } + }); + } }); after_update.forEach(add_render_callback);