2016-09-20 15 views
10

すべてのキーボード入力を検出し、設定可能なマッピングに基づいてキーストロークをアクションに変換し、さまざまな要素がバインドできるオブザーバブルを公開して特定のキー押下に反応するサービスを作成したいと考えています。サービスでHostListenerを使用することはできますか?

以下は私のコードを単純化したものですが、HostListenerがコンポーネントに含まれていたときに機能しましたが、今度は確実に初期化されても起動しないサービスに移動しました。このような入力をサービスで検出することはできませんか?

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

import { Subject } from 'rxjs/Subject'; 

@Injectable() 
export class InputService { 

    @HostListener('window:keydown', ['$event']) 
    keyboardInput(event: any) { 
     console.log(event); 
    } 
} 
+1

私はそれが可能ではないis't思います。代わりに 'window.addEventListener'を使用してください – yurzui

答えて

8

サービスでは使用できないようです。

あなたは@yurzuiのように古い方法window.addEventListenerを使用しなければなりません。

https://plnkr.co/edit/tc53cvQDfLHhaR68ilKr?p=preview

import {Component, NgModule, HostListener, Injectable} from '@angular/core' 
import {BrowserModule} from '@angular/platform-browser' 

@Injectable() 
export class MyService { 

    constructor() { 
    window.addEventListener('keydown', (event) => { 
     console.dir(event); 
    }); 
    } 

} 

@Component({ 
    selector: 'my-app', 
    template: ` 
    <div> 
     <h2>Hello {{name}}</h2> 
    </div> 
    `, 
}) 
export class App { 

    constructor(private _srvc: MyService) { 
    this.name = 'Angular2' 
    } 
} 

@NgModule({ 
    imports: [ BrowserModule ], 
    declarations: [ App ], 
    providers: [MyService], 
    bootstrap: [ App ] 
}) 
export class AppModule {} 
+0

これは私が欲しいことをする唯一の方法だと思います。 もし私がHostListenerを使いたいのであれば、目に見えないInputHandlerコンポーネントを作成し、それぞれのコンポーネントが必要なイベントを発行するように設定する必要があります。 – trelltron

+0

コンポーネントを作成するのに苦労します。 – John

関連する問題