提问者:小点点

为什么组件销毁后订阅仍然存在?


我的Angular应用程序有很多组件,一个是MyComponent,其组件类如下所示:

import { Component, OnInit } from '@angular/core';
import { Observable } from 'rxjs/Observable';
import 'rxjs/add/observable/interval';

@Component({
  selector: 'app-my',
  templateUrl: './my.component.html',
  styleUrls: ['./my.component.scss']
})
export class MyComponent implements OnInit {
  a = 'I still alive';
  constructor() {}

  ngOnInit() {
    Observable.interval(1000).subscribe(x => console.log(this.a));
  }
}

如果我访问MyComponent,订阅会按预期启动。比方说,我现在导航远离MyComponent,MyComponent现在应该被销毁。但我仍然可以看到订阅仍然存在(控制台日志不断出现)。允许订阅在主机组件(MyComponent)被销毁后继续存在的实际好处是什么?

(如果我想退订,我可以在MyComponent的ngOnDestroy()方法中进行,但如何退订不是这里讨论的重点)


共2个答案

匿名用户

在我对这个主题进行了一些研究之后,我发现我不需要取消订阅Angular管理的一些订阅,例如在ActivatedRoute上进行的订阅。这是官方指南所说的:

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

有一些例外的可观察对象不需要这样做。ActivatedRoute可观察对象是例外之一。

ActivatedRoute及其可观察对象与路由器本身隔离。当不再需要路由组件并且注入的ActivatedRoute随其一起死亡时,路由器会销毁路由组件。

无论如何,请随意取消订阅。这是无害的,从来都不是一个坏习惯。

在我必须取消订阅的情况下,推荐一种有效的广义方法。

匿名用户

可观察是RxJS的一个概念,独立于Angular生命周期。

到目前为止,您订阅的数据流是独立于Angular生命周期订阅和监控的。因此,即使组件被销毁,内存也会保留引用,因此我们会发生内存泄漏。

因此,我们需要通过取消订阅销毁阶段中的可观察来显式告诉RxJS删除该引用。