我是否必须取消订阅ActivatedRoute(例如params)可观察信息?

时间:2016-12-14 08:37:36

标签: angular typescript angular2-router3 angular2-router

我找到很多例子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);
}
  • 是否为每个组件创建自动销毁路径对象和订阅?
  • 我是否必须关心取消订阅Observable s?
  • 如果没有,你能解释一下Router中的ActivatedRoute对象树会发生什么。routerState

5 个答案:

答案 0 :(得分:74)

From the docs

订阅组件中的observable时,您几乎总是安排在组件被销毁时取消订阅。

有一些特殊的可观察物,这是不必要的。 ActivatedRoute可观察量也属于例外情况。

ActivatedRoute及其可观察对象与路由器本身绝缘。路由器在不再需要时会销毁路由组件,并且注入的ActivatedRoute会随之消失。

无论如何,请随意取消订阅。这是无害的,也绝不是坏事。

答案 1 :(得分:6)

当路由器导航到不同的路由时,组件将被销毁并且routerState将变为未引用,这将使他们可以自由地收集垃圾,包括可观察的。

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

答案 2 :(得分:1)

作为获胜回答quotes,关于subscriptionsActivatedRoute,Angular unsubscribes会自动回答。

  

The Router destroys a routed component when it is no longer needed and the injected ActivatedRoute dies with it.

如果您想知道如何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()方法,将可观察对象存储在组件中。