我會創建一個服務,其他組件可以在事件發生時訂閱。例如:
@Injectable()
public class KeyEventService {
private keydown$: Observable;
constructor() {
this.keydown$ = Observable.fromEvent(window, "keydown");
}
public getEscapeKeyListener() {
return this.keydown$.filter((event: KeyboardEvent) => event.keyCode === 27);
}
}
這允許您爲事件設置一次偵聽器,然後將其篩選到適當的按鍵。公共方法返回可以過濾特定鍵或多個鍵的observables,而無需設置新的observable。然後在你的組件,你會使用這樣的:
@Component({})
public class MyComponent implements OnInit, OnDestroy {
private keyListenerSub: Subscription;
constructor(private keyEventSvc: KeyEventService) { }
ngOnInit() {
this.keyListenerSub = this.keyEventSvc.getEscapeKeyListener().subscribe(() => {
/* respond to keypress */
});
}
ngOnDestroy() {
this.keyListenerSub.unsubscribe();
}
}
這可以讓你建立偵聽器只一次,然後在你的組件時,你想要的事件發生時你可以採取適當的行動。
Thnx,聽起來像一個非常穩固的解決方案 –