我的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()方法中执行此操作,但是如何取消订阅不是这里的讨论点)
答案 0 :(得分:0)
在对该主题进行了一些研究之后,我发现我不需要取消订阅Angular管理的某些订阅,例如在ActivatedRoute
上进行的订阅。 official guide这样说:
订阅组件中的可观察对象时,您几乎总是 安排在组件销毁时退订。
有一些不需要观察的例外观察点。 可观察到的ActivatedRoute除外。
ActivatedRoute及其可观察物与路由器绝缘 本身。当路由组件不再存在时,它会销毁它 需要,注入的ActivatedRoute随之死亡。
随时可以退订。它是无害的,永远不会坏 练习。
在我必须退订的情况下,建议使用有效的generalized approach。
答案 1 :(得分:-1)
observable
是RxJS的概念,与Angular
生命周期无关。
截至目前,您订阅的stream of data
已被订阅和监控,与Angular生命周期无关。因此,即使component
被销毁,内存也会保留引用,因此我们会发生内存泄漏。
因此,我们需要明确告诉RxJS
在unsubscribing
阶段observable
destroy
删除该引用。