提问者:小点点

对于Angular router事件可观察,为什么没有取消订阅()?


在我的ngOnInit方法中,我像这样订阅路由器:

this.router.events.subscribe(
  event => {
    if (event instanceof NavigationEnd) this.clearMessages();
  }
);

通常,对于HttpClient包之外的可观察对象,我在ngOnDestroy方法中调用取消订阅,但是当我在这里尝试时,我发现this.router.events没有这样的方法。我是错了还是这个可观察对象有什么不同?为什么不实现取消订阅?


共3个答案

匿名用户

我发现this.router.events没有这样的方法

您在订阅上调用取消订阅,而不是可观察对象。this.router.events是可观察的,而不是订阅。所以下面的工作:

const subscription = this.router.events.subscribe(...);   
subscription.unsubscribe();

匿名用户

你是对的,一些可观察对象不需要手动取消订阅,例如:

  1. 路由器,HTTP,HTTPClient,因为这些是单发射可观察的,虽然隐含,和
  2. 显式的单排放可观察值(例如,有限),例如first()

类似的信息也可以在这个reddit站点上找到。这也意味着无需担心这些类中的可观察对象的内存泄漏。

匿名用户

这是我的工作。完整的例子。

import { Subject } from 'rxjs/internal/Subject';
import { Subscription } from 'rxjs';

export class ExampleComponent implements OnInit, OnDestroy {
  routerEventSubscription: Subscription;
  private destroy$: Subject<boolean> = new Subject<boolean>();

  ngOnInit() {
    this.routerEventSubscription = this.router.events.subscribe(event => {
      if (event instanceof NavigationEnd) {
        // your code
      }
    })
  }

  ngOnDestroy(): void {
    this.routerEventSubscription.unsubscribe();
    this.destroy$.next(true);
  }

}