我发现许多示例,其中ActivatedRoute
可观察对象(如params
或url
)已订阅但未取消订阅。
constructor(private route: ActivatedRoute) {}
ngOnInit() {
this.route.params
// (+) converts string 'id' to a number
.switchMap((params: Params) => this.service.getHero(+params['id']))
.subscribe((hero: Hero) => this.hero = hero);
}
可观察
吗?路由器
中的ActivatedRoute对象树会发生什么吗?routerState
?
从文档:
当订阅组件中的可观察对象时,您几乎总是安排在组件被销毁时取消订阅。
有一些例外的可观察对象不需要这样做。ActivatedRoute可观察对象是例外之一。
ActivatedRoute及其可观察对象与路由器本身隔离。当不再需要路由组件并且注入的ActivatedRoute随其一起死亡时,路由器会销毁路由组件。
无论如何,请随意取消订阅。这是无害的,从来都不是一个坏习惯。
正如获奖答案引用的订阅
到ActivatedRoute
,Angular自动取消订阅
。
当不再需要路由组件并且注入的ActivatedRoute也随之死亡时,路由器会销毁路由组件。
如果您想知道如何从可观察对象
中取消订阅:
import { Component,
OnInit,
OnDestroy } from '@angular/core';
import { ActivatedRoute } from '@angular/router';
// Type
import { Subscription } from 'rxjs/Subscription';
@Component({
selector: 'app-example',
templateUrl: './example.component.html',
styleUrls: ['./example.component.scss']
})
export class ExampleComponent implements OnInit, OnDestroy {
paramsSubscription : Subscription;
constructor(private activatedRoute : ActivatedRoute) { }
/* Angular lifecycle hooks
*/
ngOnInit() {
console.log("Component initialized");
this.paramsSubscription = this.activatedRoute.params.subscribe( params => {
});
}
ngOnDestroy() {
console.log("Component will be destroyed");
this.paramsSubscription.unsubscribe();
}
}
当路由器导航到不同的路由时,该组件将被销毁,路由器状态将变得不可引用,这将使它们可以自由地获得垃圾收集,包括可观察的。
如果您将此组件的引用传递给其他组件或服务,则该组件不会被垃圾回收,并且订阅将保持活动状态,但我确信(无需验证)可观察对象将在导航离开时由路由器完成并导致订阅取消。