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

Можно ли использовать 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);
    }
}
4b9b3361

Ответ 1

Похоже, что его невозможно использовать в службе.

Вы должны использовать старый способ window.addEventListener, как уже указывал @yurzui.

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 {}