2016-05-21 65 views
36

我正在尋找一種方法來綁定一個函數到我的整個頁面(當用戶按下一個鍵,我希望它在我的conponent.ts中觸發一個函數)如何在整個頁面上監聽按鍵事件?

在Angular 1中很容易ng-keypress但它不適用於(keypress)="handleInput($event)"

我在整個頁面上用div包裝器試過了,但它似乎不起作用。它只在關注它時才起作用。

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

謝謝!

回答

74

我會用你的組件中@HostListener裝飾:

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

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

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

還有其他選項,如:

主機屬性@Component裝飾

角度建議在使用@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(); 
    } 
} 
+1

工件沒問題。必須添加來自'@ angular/core'的import {HostListener}。並且即使在組件的任何地方也能打電即使外面構造也工作正常 – gnganpath

+6

感謝這一點,但只是面向未來的讀者:如果你需要箭頭鍵,使用keydown而不是按鍵。 –

+2

如果您需要'esc'鍵,請使用'keyup'事件。謝謝@TroelsLarsen –

13

yurzui的答案沒有工作對我來說,這可能是一個不同的RC版,或者它可能是我的錯誤。無論哪種方式,以下是我如何在Angular2 RC4中使用我的組件。

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

這是相同的,只是替代語法,你用'keydown'而不是'keypress' –

+0

就像我說的,可能是我的錯誤,但這就是它爲我工作所需要的。 :) – Adam

+0

這對使用document.addEventListener會有什麼好處?這只是一個抽象DOM的問題嗎? – Ixonal