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

时间:2017-01-12 09:53:07

标签: angular addeventlistener event-binding

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

我正在使用Dragula拖放库。它创建了动态HTML,但我的事件没有绑定到动态HTML元素。

5 个答案:

答案 0 :(得分:50)

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);
}

答案 1 :(得分:13)

为了将EventListener添加到角度为2+的元素中,我们可以使用listen服务Renderer2的方法Renderer is deprecated,因此请使用Renderer2):

  

listen(target:'window'|'document'|'body'| any,eventName:string,callback:(event:any)=> boolean | 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');
       });
    }
}

注意:

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

你可以这样做:

ngOnDestroy() {
  this.globalInstance();
}

在此方法中使用ElementRef的方式不应使您的角度应用程序面临安全风险。有关此推荐人ElementRef security risk angular 2

的更多信息

答案 2 :(得分:3)

如果要为呈现的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");

       });
    });

}

答案 3 :(得分:2)

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

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

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

答案 4 :(得分:1)

@HostListener('window:click', ['$event']) onClick(event){ }

在下面的链接中选中此按钮,可在当前窗口中单击,击键和击键时检测CapsLock。无需在html文档中添加任何事件

Detect and warn users about caps lock is on