From 7342d484f15073141ab607b2154437884a95d0c4 Mon Sep 17 00:00:00 2001 From: Samuel Elgozi Date: Thu, 8 Aug 2019 01:57:47 +0300 Subject: [PATCH] feat: #3372 added a new `self` event modifier --- src/compiler/compile/nodes/Element.ts | 3 ++- .../render_dom/wrappers/shared/add_event_handlers.ts | 1 + src/runtime/internal/dom.ts | 8 ++++++++ .../validator/samples/event-modifiers-invalid/errors.json | 2 +- 4 files changed, 12 insertions(+), 2 deletions(-) diff --git a/src/compiler/compile/nodes/Element.ts b/src/compiler/compile/nodes/Element.ts index 80b5c6df00..62bc620590 100644 --- a/src/compiler/compile/nodes/Element.ts +++ b/src/compiler/compile/nodes/Element.ts @@ -63,7 +63,8 @@ const valid_modifiers = new Set([ 'stopPropagation', 'capture', 'once', - 'passive' + 'passive', + 'self' ]); const passive_events = new Set([ 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..06c679d984 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 @@ -10,6 +10,7 @@ export default function add_event_handlers( let snippet = handler.render(block); if (handler.modifiers.has('preventDefault')) snippet = `@prevent_default(${snippet})`; if (handler.modifiers.has('stopPropagation')) snippet = `@stop_propagation(${snippet})`; + if (handler.modifiers.has('self')) snippet = `@self(${snippet}, ${target})`; const opts = ['passive', 'once', 'capture'].filter(mod => handler.modifiers.has(mod)); diff --git a/src/runtime/internal/dom.ts b/src/runtime/internal/dom.ts index 6faf3d9c60..f8c2e7bfcd 100644 --- a/src/runtime/internal/dom.ts +++ b/src/runtime/internal/dom.ts @@ -73,6 +73,14 @@ export function stop_propagation(fn) { }; } +export function self(fn, el) { + return function(event) { + if(event.target !== el) return; + // @ts-ignore + return fn.call(this, event); + }; +} + export function attr(node: Element, attribute: string, value?: string) { if (value == null) node.removeAttribute(attribute); else node.setAttribute(attribute, value); diff --git a/test/validator/samples/event-modifiers-invalid/errors.json b/test/validator/samples/event-modifiers-invalid/errors.json index 0aac0e5327..8be2ca7348 100644 --- a/test/validator/samples/event-modifiers-invalid/errors.json +++ b/test/validator/samples/event-modifiers-invalid/errors.json @@ -1,5 +1,5 @@ [{ - "message": "Valid event modifiers are preventDefault, stopPropagation, capture, once or passive", + "message": "Valid event modifiers are preventDefault, stopPropagation, capture, once, passive or self", "code": "invalid-event-modifier", "start": { "line": 1,