我找到很多例子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);
}
Observable
s?Router
中的ActivatedRoute对象树会发生什么。routerState
?答案 0 :(得分:74)
订阅组件中的observable时,您几乎总是安排在组件被销毁时取消订阅。
有一些特殊的可观察物,这是不必要的。 ActivatedRoute可观察量也属于例外情况。
ActivatedRoute及其可观察对象与路由器本身绝缘。路由器在不再需要时会销毁路由组件,并且注入的ActivatedRoute会随之消失。
无论如何,请随意取消订阅。这是无害的,也绝不是坏事。
答案 1 :(得分:6)
当路由器导航到不同的路由时,组件将被销毁并且routerState将变为未引用,这将使他们可以自由地收集垃圾,包括可观察的。
如果将对此组件的引用传递给其他组件或服务,则该组件将不会被垃圾回收并且订阅将保持活动状态,但我确信(无需验证)该observable将由导航时路由器导致订阅取消。
答案 2 :(得分:1)
作为获胜回答quotes,关于subscriptions
到ActivatedRoute
,Angular unsubscribes
会自动回答。
如果您想知道如何unsubscribe
来自Observables
:
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 = activatedRoute.params.subscribe( params => {
});
}
ngOnDestroy() {
console.log("Component will be destroyed");
this.paramsSubscription.unsubscribe();
}
}
答案 3 :(得分:0)
无论何时添加订阅组件,在组件被销毁时几乎总是需要取消订阅。但是订阅“激活的路由”参数并不需要取消订阅,因为路由器会在不再需要订阅时破坏订阅。
答案 4 :(得分:0)
Http observables呼叫和路由器observables不需要手动退订。如果您处理其他类型的可观察对象或您自己的可观察对象,则应在ngOnDestroy()上进行操作。您可以在Suscription对象中调用unsubscribe()方法,将可观察对象存储在组件中。