web-dev-qa-db-ja.com

ActivatedRoute(e.g. params)オブザーバブルの購読を解除する必要がありますか?

ActivatedRouteparamsなどのurl Observableがサブスクライブされているが、サブスクライブ解除されていない多くの例を見つけました。

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);
}
  • ルートオブジェクトとサブスクリプションは自動的に破棄され、コンポーネントを作成するたびに新しく作成されますか?
  • それらのObservablesの購読を解除する必要がありますか?
  • そうでない場合、Router.routerStateのActivatedRouteオブジェクトのツリーで何が起こるかを説明できますか?
43
hgoebl

ドキュメントから

コンポーネントのオブザーバブルをサブスクライブする場合、ほとんどの場合、コンポーネントが破棄されるとサブスクライブを解除します。

これが必要でないいくつかの例外的な観測量があります。 ActivatedRoute observablesは例外です。

ActivatedRouteとそのObservableは、ルーター自体から隔離されています。ルーターは、不要になったルーティングされたコンポーネントを破棄し、注入されたActivatedRouteがそれとともに停止します。

とにかく登録を解除してください。これは無害であり、決して悪い習慣ではありません。

83
Milad

コンポーネントが破棄され、ルーターが別のルートに移動すると、routerStateが参照されなくなります。これにより、オブザーバブルを含むガベージコレクションが自由になります。

このコンポーネントへの参照を他のコンポーネントまたはサービスに渡すと、コンポーネントはガベージコレクトされず、サブスクリプションはアクティブのままになりますが、ナビゲートするときにルーターによってオブザーバブルが完了することは確かです(検証せずに)サブスクリプションをキャンセルします。

6

勝利の答えとして quotessubscriptionsからActivatedRouteについて、Angular unsubscribesが自動的に。

ルーターは不要になったルーティングされたコンポーネントを破棄し、注入されたActivatedRouteが死ぬ。

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

}
1
Marian07

コンポーネントにサブスクライブを追加するときはいつでも、コンポーネントが破棄されたときに、ほとんどサブスクライブを解除する必要があります。ただし、ルーターが不要になったときにサブスクライブを破棄するため、Activated route paramsをサブスクライブする必要はありません。

0
thegautamnayak