我的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()方法中进行,但如何退订不是这里讨论的重点)
在我对这个主题进行了一些研究之后,我发现我不需要取消订阅Angular管理的一些订阅,例如在ActivatedRoute
上进行的订阅。这是官方指南所说的:
当订阅组件中的可观察对象时,您几乎总是安排在组件被销毁时取消订阅。
有一些例外的可观察对象不需要这样做。ActivatedRoute可观察对象是例外之一。
ActivatedRoute及其可观察对象与路由器本身隔离。当不再需要路由组件并且注入的ActivatedRoute随其一起死亡时,路由器会销毁路由组件。
无论如何,请随意取消订阅。这是无害的,从来都不是一个坏习惯。
在我必须取消订阅的情况下,推荐一种有效的广义方法。
可观察
是RxJS的一个概念,独立于Angular
生命周期。
到目前为止,您订阅的数据流
是独立于Angular生命周期订阅和监控的。因此,即使组件
被销毁,内存也会保留引用,因此我们会发生内存泄漏。
因此,我们需要通过取消订阅
销毁
阶段中的可观察
来显式告诉RxJS
删除该引用。