ActivatedRoute
やparams
などの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);
}
Observable
sの購読を解除する必要がありますか?Router
.routerState
のActivatedRouteオブジェクトのツリーで何が起こるかを説明できますか?ドキュメントから :
コンポーネントのオブザーバブルをサブスクライブする場合、ほとんどの場合、コンポーネントが破棄されるとサブスクライブを解除します。
これが必要でないいくつかの例外的な観測量があります。 ActivatedRoute observablesは例外です。
ActivatedRouteとそのObservableは、ルーター自体から隔離されています。ルーターは、不要になったルーティングされたコンポーネントを破棄し、注入されたActivatedRouteがそれとともに停止します。
とにかく登録を解除してください。これは無害であり、決して悪い習慣ではありません。
コンポーネントが破棄され、ルーターが別のルートに移動すると、routerStateが参照されなくなります。これにより、オブザーバブルを含むガベージコレクションが自由になります。
このコンポーネントへの参照を他のコンポーネントまたはサービスに渡すと、コンポーネントはガベージコレクトされず、サブスクリプションはアクティブのままになりますが、ナビゲートするときにルーターによってオブザーバブルが完了することは確かです(検証せずに)サブスクリプションをキャンセルします。
勝利の答えとして quotessubscriptions
からActivatedRoute
について、Angular unsubscribes
が自動的に。
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();
}
}
コンポーネントにサブスクライブを追加するときはいつでも、コンポーネントが破棄されたときに、ほとんどサブスクライブを解除する必要があります。ただし、ルーターが不要になったときにサブスクライブを破棄するため、Activated route paramsをサブスクライブする必要はありません。