我正在寻找一种将函数绑定到整个页面的方法(当用户按键时,我希望它会触发component.ts中的一个函数)。
在 AngularJS 中使用 ng-keypress
很容易实现这个功能,但是在 (keypress)="handleInput($event)"
中却行不通。
我尝试使用一个包装整个页面的 div,但似乎无效。 只有在焦点在它上面时才起作用。
<div (keypress)="handleInput($event)" tabindex="1">
我正在寻找一种将函数绑定到整个页面的方法(当用户按键时,我希望它会触发component.ts中的一个函数)。
在 AngularJS 中使用 ng-keypress
很容易实现这个功能,但是在 (keypress)="handleInput($event)"
中却行不通。
我尝试使用一个包装整个页面的 div,但似乎无效。 只有在焦点在它上面时才起作用。
<div (keypress)="handleInput($event)" tabindex="1">
我会在你的组件中使用@HostListener装饰器:
import { HostListener } from '@angular/core';
@Component({
...
})
export class AppComponent {
@HostListener('document:keypress', ['$event'])
handleKeyboardEvent(event: KeyboardEvent) {
this.key = event.key;
}
}
还有其他选择,例如:
@Component
装饰器内的 host 属性
Angular 建议使用 @HostListener
装饰器而不是 host 属性。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();
}
}
仅补充一点,在2019年使用Angular 8时,
不再使用keypress而是要使用keydown。
@HostListener('document:keypress', ['$event'])
至
@HostListener('document:keydown', ['$event'])
使用Stacklitz工作
yurzui的答案对我没有用,可能是因为使用了不同的RC版本,或者可能是我的问题。无论如何,下面是我在Angular2 RC4中处理组件的方法(现在已经相当过时)。
@Component({
...
host: {
'(document:keydown)': 'handleKeyboardEvents($event)'
}
})
export class MyComponent {
...
handleKeyboardEvents(event: KeyboardEvent) {
this.key = event.which || event.keyCode;
}
}
keydown
而不是 keypress
。 - Günter Zöchbauerkey
定义为类变量,或更改赋值以分配给局部变量。 - Adam如果你想在特定的键盘按键按下时执行任何事件,那么可以使用@HostListener。为此,您需要在组件ts文件中导入HostListener。
import { HostListener } from '@angular/core';
然后在组件ts文件中任何位置使用以下函数。
@HostListener('document:keyup', ['$event'])
handleDeleteKeyboardEvent(event: KeyboardEvent) {
if(event.key === 'Delete')
{
// remove something...
}
}
请注意,“document:keypress”已被弃用。我们应该使用“document:keydown”代替。
链接:https://developer.mozilla.org/fr/docs/Web/API/Document/keypress_event
import { Component, HostListener } from '@angular/core';
并且
@HostListener('document:keydown', ['$event'])
handleTheKeyboardEvent(event: KeyboardEvent) {
switch (event.key) {
case "F2":
this.myF2Action();
event.preventDefault();
break;
}
}
我认为这是最好的工作
https://angular.io/api/platform-browser/EventManager
例如,在 app.component 中。constructor(private eventManager: EventManager) {
const removeGlobalEventListener = this.eventManager.addGlobalEventListener(
'document',
'keypress',
(ev) => {
console.log('ev', ev);
}
);
}
addGlobalEventListener
已被 @deprecated — 在 Ivy 代码中不再使用。将在版本14中删除。 - Mike de Klerk
window:keypress
吗? - KarolDepka