如何在Angular 2中绑定渲染元素的事件侦听器?

Sud*_*rma 25 addeventlistener event-binding angular

如何在Angular 2中的渲染元素中绑定事件侦听器?

我正在使用Dragula拖放库.它创建动态HTML但我的事件不绑定到动态HTML元素.

Gün*_*uer 62

import { AfterViewInit, Component, ElementRef} from '@angular/core';

constructor(private elementRef:ElementRef) {}

ngAfterViewInit() {
  this.elementRef.nativeElement.querySelector('my-element')
                                .addEventListener('click', this.onClick.bind(this));
}

onClick(event) {
  console.log(event);
}
Run Code Online (Sandbox Code Playgroud)

  • 在销毁组件后需要进行任何手动清理(`.removeEventListener()`)或者Angular会处理这个问题吗? (4认同)
  • 请记住将“implements AfterViewInit”添加到类声明中 (4认同)
  • 不,如果你必须注册它,你需要强制删除它. (3认同)
  • @Kannan 您传递给`bind` 的内容将在`onClick() { ... }` 中作为`this` 在调用时可用,所以是的,基本上可以传递任何对象。 (2认同)
  • 这是一个小问题,但可能会发现一些问题。选择器当然需要一个 # 或一个 。在开始时取决于它是一个 id 还是一个类,例如 `'#my-element'` 如果 `<div id="my-element">` (2认同)

HDJ*_*MAI 18

为了将事件侦听添加到角度2+的元素,我们可以使用该方法的的Renderer2服务(渲染器已过时,所以使用Renderer2):

listen(target:'window'|'document'|'body'| any,eventName:string,callback:(event:any)=> boolean | void):()=> void

例:

export class ListenDemo implements AfterViewInit { 
   @ViewChild('testElement') 
   private testElement: ElementRef;
   globalInstance: any;       

   constructor(private renderer: Renderer2) {
   }

   ngAfterViewInit() {
       this.globalInstance = this.renderer.listen(this.testElement.nativeElement, 'click', () => {
           this.renderer.setStyle(this.testElement.nativeElement, 'color', 'green');
       });
    }
}
Run Code Online (Sandbox Code Playgroud)

注意:

当您使用此方法将事件侦听器添加到dom中的元素时,应该在组件被销毁时删除此事件侦听器

你可以这样做:

ngOnDestroy() {
  this.globalInstance();
}
Run Code Online (Sandbox Code Playgroud)

此方法中的使用ElementRef方法不应使您的角度应用程序面临安全风险.有关此引用者的更多信息,请参阅ElementRef安全风险角度2

  • 是否需要'不听'onDestroy?或者Angular会照顾它吗? (3认同)
  • @MehmetGunacti:好问题.答案是**YES**,你应该在调用ngOnDestroy时不听.我会用这个更新答案.只需要引用``this.renderer.listen``就像``globalInstance = this.renderer.listen ...``并在之后调用它:``ngOnDestroy(){this.globalInstance();}`` (3认同)

Sag*_*ora 7

如果您想为呈现的 DOM 元素中具有相同类的所有元素绑定一个类似“click”的事件,那么您可以通过使用 components.ts 文件中的以下部分代码来设置事件侦听器。

import { Component, OnInit, Renderer, ElementRef} from '@angular/core';

constructor( elementRef: ElementRef, renderer: Renderer) {
    dragulaService.drop.subscribe((value) => {
      this.onDrop(value.slice(1));
    });
}

public onDrop(args) {

  let [e, el] = args;

  this.toggleClassComTitle(e,'checked');

}


public toggleClassComTitle(el: any, name: string) {

    el.querySelectorAll('.com-item-title-anchor').forEach( function ( item ) {

      item.addEventListener('click', function(event) {
              console.log("item-clicked");

       });
    });

}
Run Code Online (Sandbox Code Playgroud)


Han*_*ono 6

HostListener应该是将事件绑定到组件的正确方法:

@Component({
  selector: 'your-element'
})

export class YourElement {
  @HostListener('click', ['$event']) onClick(event) {
     console.log('component is clicked');
     console.log(event);
  }
}
Run Code Online (Sandbox Code Playgroud)


Gop*_*ika 5

@HostListener('window:click', ['$event']) onClick(event){ }
Run Code Online (Sandbox Code Playgroud)

检查下面的链接以检测当前窗口上的单击、键盘上和下键盘上的 CapsLock。无需在 html doc 中添加任何事件

检测并警告用户大写锁定已打开