如何使用RxJ传输HostListener事件?

时间:2018-07-20 17:18:41

标签: javascript angular rxjs

我找到了大量有关如何绑定Angular HostListeners的资源:

@HostListener('document:click', ['$event'])
handleClick(event: Event) {
     // etc
}

但是我将如何使用RxJs进行流传输?

documentClickedStream = Observable.fromEvent(/* how to bind this? */)

不确定如何使用Angular文档中建议的装饰器模式进行绑定以创建“随处单击”流。

4 个答案:

答案 0 :(得分:1)

这是我的工作示例。 首先,您需要将此行导入到组件中


import { fromEvent } from 'rxjs/internal/observable/fromEvent';

然后将这段代码放入您的组件构造函数或ngOnInit

   fromEvent(document, 'click').subscribe(event => {
      console.log(event);
    })

答案 1 :(得分:0)

使用模板引用获取按钮的引用

由于我们将文档定位为目标,因此它将起作用。

@ViewChild('btn') btn:ElementRef;
documentClickedStream = Observable.fromEvent(window['document'],'click');

工作示例:https://stackblitz.com/edit/rxjs-window

答案 2 :(得分:0)

我想最简单的方法是只使用一个中间主题:

  @HostListener('document:click', ['$event'])
  onKeyUp(e:Event) {
      this.clickStream$.next(e);
  }

然后像平常一样订阅它

  this.clickStream$
      .asObservable()
      .pipe(
          // some operators...
      )
      .subscribe();

答案 3 :(得分:0)

您还可以使用以下给定的代码订阅RxJs事件,将以下给定的代码添加到ngOnInit事件:

this.subscribe(fromEvent(document, 'visibilitychange'), (e: Event) => {
    console.log('visibilitychange');
    this.getVisibilitychange(true);
});