首页 文章

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

提问于
浏览
20

我找到许多例子,其中 ActivatedRoute Observables如 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

  • 如果没有,你能解释一下 Router 中ActivatedRoute对象树会发生什么 . routerState

4 回答

  • 6

    From the docs

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

    有一些特殊的可观测量,这是没有必要的 . ActivatedRoute可观察量是例外 .

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

    无论如何,请随意取消订阅 . 它是无害的,从来都不是一种糟糕的做法 .

  • 0

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

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

  • 0

    作为获胜答案quotes关于 subscriptionsActivatedRoute ,Angular unsubscribes 自动 .

    当不再需要路由组件时,路由器会销毁它,并且注入的ActivatedRoute会随之消失 .

    如果你想知道如何从 Observables unsubscribe

    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();
      }
    
    }
    
  • 46

    每当您添加订阅组件时,您总是几乎需要在组件被销毁时取消订阅 . 但订阅Activated route params不需要取消订阅,因为路由器会在不再需要时销毁订阅 .

相关问题