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

问题描述 投票:0回答:4

我的代码:

ngOnInit() {

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

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

}

我的问题是……我需要在 ngOnDestroy 中取消订阅这些内容吗?

作为习惯问题,我总是取消订阅,但不确定这里是否有必要。

谢谢

angular rxjs
4个回答
5
投票

不,您不需要取消订阅路线可观察对象

来自 文档

当订阅组件中的可观察对象时,您几乎总是在组件被销毁时取消订阅。

但是,ActivatedRoute observables 属于例外,因为 ActivatedRoute 及其 observables 与 Router 本身是隔离的。当不再需要路由组件时,路由器会销毁它。这意味着组件的所有成员也将被销毁,包括注入的 ActivatedRoute 及其 Observable 属性的订阅。

路由器不会完成ActivatedRoute的任何Observable,因此任何finalize或complete块都不会运行。如果你需要在 Finalize 中处理某些事情,你仍然需要在 ngOnDestroy 中取消订阅。如果您的可观察管道因组件被销毁后您不想运行的代码而出现延迟,您还必须取消订阅。


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


1
投票

对于激活的路由 observable 是一个例外,因为

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 文档


1
投票

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

activatedRoute

© www.soinside.com 2019 - 2024. All rights reserved.