Angular中是否需要取消订阅this.activatedRoute的订阅?

3

我的代码:

ngOnInit() {

  this.activatedRoute.params.subscribe((params: Params) => {
    // do stuff
  })

  this.activatedRoute.data.subscribe((data: any) => {
    // do stuff
  })

}

我的问题是...在ngOnDestroy中是否需要取消这些订阅?

作为一种习惯,我总是取消订阅,但不确定在这里是否必要。

谢谢

4个回答

5
不,您不需要取消订阅路由可观察对象。
来自文档 当在组件中订阅可观察对象时,您几乎总是会在组件销毁时取消订阅。有一些特殊的可观察对象不需要这样做。ActivatedRoute 可观察对象就是其中之一。
ActivatedRoute及其可观察对象与 Router 本身隔离开来。当不再需要路由组件时,Router 会销毁它,并连同注入的 ActivatedRoute 一起消失。
但是如果您想要取消订阅,也可以放心使用,这不会有任何危害,永远不会是一个坏习惯。

3
FYI文档中这么说,但截至Angular最新版本发布时,它似乎仍然不总是正确的。在我的应用程序中不取消订阅ActivatedRoute导致了很多内存泄漏问题。 - bryan60

2
我宁愿取消所有订阅,也不想控制例外情况。这样似乎更容易维护。
类似这样的东西。
  ngOnInit() {
    this.subscriptions.push(
      this.activatedRoute.params.subscribe((params: Params) => {
        // do stuff
      }));

    this.subscriptions.push(
      this.activatedRoute.data.subscribe((data: any) => {
        // do stuff
      }));
  }

  ngOnDestroy() {
    this.subscriptions.forEach((subscription: Subscription) => {
      subscription.unsubscribe();
    });
  }

请查看这个示例: https://stackblitz.com/edit/angular-unsubscribing-then-all?file=src/app/app.component.ts

请查看 https://medium.com/angular-in-depth/the-best-way-to-unsubscribe-rxjs-observable-in-the-angular-applications-d8f9aa42f6a0 的第三点,以获得一种更加简洁的取消订阅方式。 - Jensen

1
对于激活路由的可观察对象,有一个例外情况,因为The ActivatedRoute and its observables are insulated from the Router itself. The Router destroys a routed component when it is no longer needed and the injected ActivatedRoute dies with it. 来源:Angular Doc

1

通常情况下,当您的组件销毁时,所有已订阅的可观察对象都会自动取消订阅,但有一些例外。但是,activatedRoute不是其中之一。当路由器从路由组件退出时,它将销毁该组件以及注入的activatedRoute


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接