提问者:小点点

我必须取消订阅ActivatedRoute(例如参数)可观察对象吗?


我发现许多示例,其中ActivatedRoute可观察对象(如paramsurl)已订阅但未取消订阅。

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

共3个答案

匿名用户

从文档:

当订阅组件中的可观察对象时,您几乎总是安排在组件被销毁时取消订阅。

有一些例外的可观察对象不需要这样做。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();
  }

}

匿名用户

当路由器导航到不同的路由时,该组件将被销毁,路由器状态将变得不可引用,这将使它们可以自由地获得垃圾收集,包括可观察的。

如果您将此组件的引用传递给其他组件或服务,则该组件不会被垃圾回收,并且订阅将保持活动状态,但我确信(无需验证)可观察对象将在导航离开时由路由器完成并导致订阅取消。