Comment lier un écouteur d'événement dans des éléments rendus dans Angular 2?
J'utilise la bibliothèque Dragula Drag and Drop. Il crée du code HTML dynamique, mais mon événement n'est pas lié aux éléments HTML dynamiques.
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);
}
Pour ajouter un EventListener à un élément dans angular 2+, nous pouvons utiliser la méthode listen du Renderer2 service ( Renderer est obsolète , utilisez donc Renderer2):
listen (target: 'window' | 'document' | 'body' | any, eventName: string, callback: (event: any) => boolean | void): () => void
Exemple:
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');
});
}
}
Note:
Lorsque vous utilisez cette méthode pour ajouter un écouteur d'événement à un élément du dom, vous devez supprimer cet écouteur d'événement lorsque le composant est détruit
Vous pouvez le faire de cette façon:
ngOnDestroy() {
this.globalInstance();
}
Le mode d'utilisation de ElementRef
dans cette méthode ne doit pas exposer votre application angular à un risque de sécurité. pour en savoir plus sur ce référent vers Risque pour la sécurité ElementRef angular 2
HostListener devrait être le moyen approprié de lier un événement à votre composant:
@Component({
selector: 'your-element'
})
export class YourElement {
@HostListener('click', ['$event']) onClick(event) {
console.log('component is clicked');
console.log(event);
}
}
Si vous souhaitez lier un événement tel que 'clic' pour tous les éléments de même classe dans l'élément DOM rendu, vous pouvez configurer un écouteur d'événement en utilisant les parties suivantes du code dans le fichier 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");
});
});
}
@HostListener('window:click', ['$event']) onClick(event){ }
cochez ce lien ci-dessous pour détecter CapsLock lors d'un clic, d'une touche à l'autre et d'une touche à la touche dans la fenêtre actuelle. Pas besoin d'ajouter n'importe quel événement dans le doc html
Détecter et avertir les utilisateurs du verrouillage des majuscules