我的代码:
ngOnInit() {
this.activatedRoute.params.subscribe((params: Params) => {
// do stuff
})
this.activatedRoute.data.subscribe((data: any) => {
// do stuff
})
}
我的问题是……我需要在 ngOnDestroy 中取消订阅这些内容吗?
作为习惯问题,我总是取消订阅,但不确定这里是否有必要。
谢谢
不,您不需要取消订阅路线可观察对象
来自 文档
当订阅组件中的可观察对象时,您几乎总是在组件被销毁时取消订阅。
但是,ActivatedRoute observables 属于例外,因为 ActivatedRoute 及其 observables 与 Router 本身是隔离的。当不再需要路由组件时,路由器会销毁它。这意味着组件的所有成员也将被销毁,包括注入的 ActivatedRoute 及其 Observable 属性的订阅。
路由器不会完成ActivatedRoute的任何Observable,因此任何finalize或complete块都不会运行。如果你需要在 Finalize 中处理某些事情,你仍然需要在 ngOnDestroy 中取消订阅。如果您的可观察管道因组件被销毁后您不想运行的代码而出现延迟,您还必须取消订阅。
我宁愿取消所有订阅,然后控制例外情况。看起来更容易维护。
类似这样的事情
ngOnInit() {
this.subscriptions.push(
this.activatedRoute.params.subscribe((params: Params) => {
// do stuff
}));
this.subscriptions.push(
this.activatedRoute.data.subscribe((data: any) => {
// do stuff
}));
}
ngOnDestroy() {
this.subscriptions.forEach((subscription: Subscription) => {
subscription.unsubscribe();
});
}
请参阅此处的示例:https://stackblitz.com/edit/angular-unsubscribing-then-all?file=src/app/app.component.ts
对于激活的路由 observable 是一个例外,因为
The ActivatedRoute and its observables are insulated from the Router itself. The Router destroys a routed component when it is no longer needed and the injected ActivatedRoute dies with it.
来源:Angular 文档
通常,当你的组件销毁时,所有订阅的可观察对象都会自动取消订阅,几乎没有例外。但activatedRoute不是其中之一。当路由器从路由组件退出时,它将销毁该组件以及注入的
activatedRoute