19

是否可以使用新的 angular 4 渲染器删除侦听器?

这是界面:

abstract listen(target: 'window' | 'document' | 'body' | any, eventName: string, callback: (event: any) => boolean | void): () => void;

在渲染器 v1 中,listen 和 listenGlobal 返回一个 Function,但这个返回 void。

这是一个问题吗?如果没有,我该如何删除监听器?

4

3 回答 3

58

没有区别Renderer

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

export class MyComponent {
  listenerFn: () => void;

  constructor(private renderer: Renderer2) {}

  ngOnInit() {
    this.listenerFn = this.renderer.listen(document, 'mousemove', () => console.log('move'));
  }

  ngOnDestroy() {
    if (this.listenerFn) {
      this.listenerFn();
    }
  }
}
于 2017-06-09T09:43:33.137 回答
0

将 Renderer.listen 处理程序的结果放入变量中更容易:

listener: any;

this.listener = this.renderer.listen('body', 'mousemove', (event) => {
  console.log(event);
});

并且当取消事件发生时,调用带有空参数的变量

this.renderer.listen('body', 'mouseup', (event) => {
  this.listener();
});
于 2020-05-12T20:35:10.400 回答
0

您也可以使用rxjsfromEventPattern中的函数。

  private createOnClickObservable(renderer: Renderer2) {
    let removeClickEventListener: () => void;
    const createClickEventListener = (
      handler: (e: Event) => boolean | void
    ) => {
      removeClickEventListener = renderer.listen("document", "click", handler);
    };

    this.onClick$ = fromEventPattern<Event>(createClickEventListener, () =>
      removeClickEventListener()
    ).pipe(takeUntil(this._destroy$));
  }

只需按预期使用/订阅它

   myMouseService.onClick$.subscribe((e: Event) => {
      console.log("CLICK", e);
    });

并且不用担心破坏,它会在关闭 observable 时由 rxjs 处理!

现场演示:https ://stackblitz.com/edit/angular-so4?file=src%2Fapp%2Fmy-mouse.service.ts

查看另一个答案,了解更多详细信息:Is it possible to use HostListener in a Service? 或者如何在 Angular 服务中使用 DOM 事件?

于 2020-02-19T09:27:58.567 回答