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

hgo*_*ebl 48 typescript angular2-router angular2-router3 angular

我发现许多ActivatedRouteObservables喜欢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);
}
Run Code Online (Sandbox Code Playgroud)
  • 路径对象和订阅是否自动销毁并为每个组件创建新创建?
  • 我是否必须关心取消订阅Observable
  • 如果没有,你能解释一下ActivatedRoute对象树会发生什么Router.routerState

Mil*_*lad 93

来自文档:

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

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

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

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

  • @TetraDev喜欢这个.. ngOnInit(){this.routeSub = this.route.paramMap .subscribe(params => {this.event = this.eventService.getEvent(+ params.get('id'));}); } ngOnDestroy(){this.routeSub.unsubscribe(); } (6认同)
  • 您如何退订,因为这绝不是“坏习惯”。文件完全没有提供取消订阅的范例 (2认同)
  • 我更新了这个答案中的文档链接,但请注意“无论如何,请随意取消订阅。这是无害的,而且绝不是一个坏习惯。” 文档中不再有这句话。 (2认同)

Mar*_*n07 7

作为获奖的答案报价关于subscriptionsActivatedRoute,角unsubscribes自动。

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

如果您想知道如何unsubscribeObservables

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

}
Run Code Online (Sandbox Code Playgroud)


Gün*_*uer 6

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

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

  • 这意味着“ActivatedRoute”是每次路线导航后的一个新实例,对吗?那么如何订阅更改后的路由参数呢?也许你可以解释一下 `ActivatedRoute` 的特殊生命周期?每次导航后是否都会从根重新创建“RouterState”树?如果导航后组件被破坏,这会导致闪烁!? (2认同)
  • 如果您导航到不同的路线,则该组件将被销毁,如果您向后导航,它将重新创建。如果您在不同的路线上有相同的组件,并且您从一个导航到另一个,则该组件也会被销毁并重新创建。只有当你导航时,只有路由参数发生变化,组件实例才会被重用。最近的版本支持自定义重用策略。另见 https://github.com/angular/angular/issues/7757#issuecomment-236737846 和 https://www.softwarearchitekt.at/post/2016/12/02/sticky-routes-in-angular-2- 3-with-routereusestrategy.aspx (2认同)