Je cherche un moyen de lier une fonction à la totalité de la page (lorsqu'un utilisateur appuie sur une touche, je veux qu'elle déclenche une fonction dans mon composant.ts)
C'était facile dans AngularJS avec un ng-keypress
mais cela ne fonctionne pas avec (keypress)="handleInput($event)"
.
Je l'ai essayé avec un wrapper div sur toute la page mais cela ne semble pas fonctionner. cela ne fonctionne que lorsque l'accent est mis dessus.
<div (keypress)="handleInput($event)" tabindex="1">
Je voudrais utiliser @ HostListener décorateur dans votre composant:
import { HostListener } from '@angular/core';
@Component({
...
})
export class AppComponent {
@HostListener('document:keypress', ['$event'])
handleKeyboardEvent(event: KeyboardEvent) {
this.key = event.key;
}
}
Il y a aussi d'autres options comme:
Propriété de l'hôte dans @Component
decorator
Angular recommande d'utiliser @HostListener
decorator sur la propriété Host https://angular.io/guide/styleguide#style-06-
@Component({
...
Host: {
'(document:keypress)': 'handleKeyboardEvent($event)'
}
})
export class AppComponent {
handleKeyboardEvent(event: KeyboardEvent) {
console.log(event);
}
}
renderer.listen
import { Component, Renderer2 } from '@angular/core';
@Component({
...
})
export class AppComponent {
globalListenFunc: Function;
constructor(private renderer: Renderer2) {}
ngOnInit() {
this.globalListenFunc = this.renderer.listen('document', 'keypress', e => {
console.log(e);
});
}
ngOnDestroy() {
// remove listener
this.globalListenFunc();
}
}
Observable.fromEvent
import { Observable } from 'rxjs/Observable';
import 'rxjs/add/observable/fromEvent';
import { Subscription } from 'rxjs/Subscription';
@Component({
...
})
export class AppComponent {
subscription: Subscription;
ngOnInit() {
this.subscription = Observable.fromEvent(document, 'keypress').subscribe(e => {
console.log(e);
})
}
ngOnDestroy() {
this.subscription.unsubscribe();
}
}
la réponse de yurzui n'a pas fonctionné pour moi, il pourrait s'agir d'une version différente de la télécommande ou d'une erreur de ma part. Quoi qu'il en soit, voici comment je l'ai fait avec mon composant dans Angular2 RC4 (qui est maintenant assez obsolète).
@Component({
...
Host: {
'(document:keydown)': 'handleKeyboardEvents($event)'
}
})
export class MyComponent {
...
handleKeyboardEvents(event: KeyboardEvent) {
this.key = event.which || event.keyCode;
}
}
Pour ajouter à cela en 2019 w Angular 8,
au lieu d'appuyer sur je devais utiliser keydown
@HostListener('document:keypress', ['$event'])
à
@HostListener('document:keydown', ['$event'])
Travailler Stacklitz
Si vous souhaitez exécuter un événement sur n'importe quelle touche du clavier, vous pouvez utiliser @HostListener. Pour cela, vous devez importer HostListener dans votre fichier ts de composant.
import {HostListener} from '@ angular/core';
puis utilisez la fonction ci-dessous n’importe où dans le fichier ts de votre composant.
@HostListener('document:keyup', ['$event'])
handleDeleteKeyboardEvent(event: KeyboardEvent) {
if(event.key === 'Delete')
{
// remove something...
}
}