javascript - Angular2 自定义事件

标签 javascript angular

我正在尝试找出如何处理 Angular 之外的事件发出的自定义 DOM 事件,例如以下内容:

document.querySelector('my-custom-element').dispatchEvent(new Event('my.customEvent'));

到目前为止,我已经尝试注册一个新的 EventManagerPlugin,它支持以“my”开头的所有内容。但是如果我打印出所有“正常”事件(如“点击”和“提交”)所产生的所有事件;但没有我的自定义事件。

html:

<my-custom-element (my.customEvent)="handleCustomEvent($event)"></my-custom-element>

ts:

supports(eventName: string):boolean {
    var ret = false;
    if (eventName.indexOf('my.') === 0) {
        ret = true;
    }
    console.log('supports event?', eventName, ret);
    return ret;
}

console.log 行仅打印 native 事件和 ng*events,但不打印我的自定义事件:(

编辑固定解决方案 我已将 (my.customEvent) 移至组件内,并且日志显示了自定义事件。 通过在 EventManagerPlugin 中使用自定义事件处理程序来修复将外部事件绑定(bind)到 Angular2 内部事件并分离 2 的问题 相关代码

addEventListener(element: HTMLElement, eventName: string, handler: Function): Function {
    let zone = this.manager.getZone();

    // Entering back into angular to trigger changeDetection
    var outsideHandler = (event: any) => {
        zone.run(() => handler(event));
    };

    // Executed outside of angular so that change detection is not constantly triggered.
    var addAndRemoveHostListenersForOutsideEvents = () => {
        this.manager.addEventListener(element, 'external.' + eventName, outsideHandler);
    }
    return this.manager.getZone().runOutsideAngular(addAndRemoveHostListenersForOutsideEvents);
}

通过 DOM 触发事件:

document.querySelector('my-custom-element').dispatchEvent(new Event('external.my.customEvent'));

现在您可以从 DOM 触发一个事件,该事件被推送到 angular2 世界中,并且可以从组件内部处理代码。

最佳答案

尝试扩展DomEventsPlugin,例如:

import {DomEventsPlugin} from 'angular2/platform/common_dom';
// Have to pull DOM from src because platform/common_dom returns DOM as null.
// I believe its a TS bug.
import {DOM} from 'angular2/src/platform/dom/dom_adapter';
import {Injectable} from 'angular2/core';
import {noop} from 'angular2/src/facade/lang';

@Injectable()
export class DOMOutsideEventPlugin extends DomEventsPlugin {
  eventMap: Object = {
    "clickOutside": "click",
    "mousedownOutside": "mousedown",
    "mouseupOutside": "mouseup",
    "mousemoveOutside": "mousemove"
  }
  supports(eventName: string): boolean {
    return this.eventMap.hasOwnProperty(eventName);
  }

  addEventListener(element: HTMLElement, eventName: string, handler: Function): Function {
    var zone = this.manager.getZone();
    var documentEvent = this.eventMap[eventName];

    // Entering back into angular to trigger changeDetection 
    var outsideHandler = (event) => {
        zone.run(() => handler(event))
    };

    // Executed outside of angular so that change detection is not constantly triggered.
    var addAndRemoveHostListenersForOutsideEvents = () => {
      DOM.onAndCancel(DOM.getGlobalEventTarget('document'), documentEvent,
        (event) => {
          let current = event.target;
          // if the element/event is propagating from the element its bound to, don't handle it.
          if (current.parentNode && current !== element) {
              outsideHandler(event);
        }
      });
    }
    return this.manager.getZone().runOutsideAngular(addAndRemoveHostListenersForOutsideEvents);
  }

  addGlobalEventListener(target: string, eventName: string, handler: Function): Function {
    var element = DOM.getGlobalEventTarget(target);
    var zone = this.manager.getZone();
    var outsideHandler = (event) => zone.run(() => handler(event));

    if ((target === "document") || (target === "window" )) {
      return noop;
    }
    return this.manager.getZone().runOutsideAngular(
        () => DOM.onAndCancel(element, eventName, outsideHandler)
    );
  }
}

来源:https://medium.com/@TheLarkInn/creating-custom-dom-events-in-angular2-f326d348dc8b#.so0jvssnz

关于javascript - Angular2 自定义事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38683050/

相关文章:

angular - 如何将 core-js 映射导入到 angular-cli webpack 生成的应用程序中

javascript - 使用 JavaScript 解析 URL

angular - 如何检测 Angular 中的死代码或未使用的代码?

javascript - Vue.js 观察深层属性

对象中的 Javascript 对象错误

javascript - Angular - 具有嵌入式 View 的结构指令不会将子级传递给 ng-template

angular - 如何删除使用 Angular-CLI 创建的组件

angular - 如何向守卫传递参数?

Javascript:使用链调用new实例化一个对象

javascript - 在node.js中上传文件