Подтвердить что ты не робот

Как я могу прослушать событие нажатия клавиши на всей странице?

Я ищу способ привязать функцию ко всей моей странице (когда пользователь нажимает клавишу, я хочу, чтобы она вызывала функцию в моем component.ts)

Это было легко в AngularJS с ng-keypress но он не работает с (keypress)="handleInput($event)".

Я пробовал это с оберткой div на всей странице, но это, похоже, не работает. это работает только тогда, когда основное внимание уделяется этому.

<div (keypress)="handleInput($event)" tabindex="1">
4b9b3361

Ответ 1

Я бы использовал @HostListener decorator в вашем компоненте:

import { HostListener } from '@angular/core';

@Component({
  ...
})
export class AppComponent {

  @HostListener('document:keypress', ['$event'])
  handleKeyboardEvent(event: KeyboardEvent) { 
    this.key = event.key;
  }
}

Есть и другие варианты, такие как:

свойство хоста в декораторе @Component

Angular рекомендует использовать декоратор @HostListener поверх свойства хоста https://angular.io/guide/styleguide#style-06-03

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

Ответ 2

Ответ yurzui не сработал для меня, это может быть другая версия RC или ошибка с моей стороны. В любом случае, вот как я это сделал со своим компонентом в Angular2 RC4 (который сейчас довольно устарел).

@Component({
    ...
    host: {
        '(document:keydown)': 'handleKeyboardEvents($event)'
    }
})
export class MyComponent {
    ...
    handleKeyboardEvents(event: KeyboardEvent) {
        this.key = event.which || event.keyCode;
    }
}

Ответ 3

Просто чтобы добавить к этому в 2019 году w Angular 8,

вместо нажатия клавиш я должен был использовать keydown

@HostListener('document:keypress', ['$event'])

в

@HostListener('document:keydown', ['$event'])

Работая Stacklitz

Ответ 4

Если вы хотите выполнить какое-либо событие на любом конкретном нажатии кнопки клавиатуры, в этом случае вы можете использовать @HostListener. Для этого вам необходимо импортировать HostListener в ваш файл ts компонента.

импортировать {HostListener} из '@angular/core';
затем используйте функцию ниже в любом месте вашего компонента файла TS.

@HostListener('document:keyup', ['$event'])
  handleDeleteKeyboardEvent(event: KeyboardEvent) {
    if(event.key === 'Delete')
    {
      // remove something...
    }
  }