Должен ли я отказаться от подписки на наблюдаемые переменные ActivatedRoute (например, params)?
Я нахожу много примеров, где ActivatedRoute
Наблюдаемые, такие как params
или url
, подписаны, но не отписаны.
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?
- Если нет, можете ли вы объяснить, что происходит с деревом объектов ActivatedRoute в
Router
. routerState
?
Ответы
Ответ 1
Из документов:
При подписке на наблюдаемый в компоненте вы почти всегда можете отказаться от подписки при уничтожении компонента.
Есть несколько исключительных наблюдаемых, где это не обязательно. Среди исключений являются наблюдаемые ActivatedRoute.
ActivatedRoute и его наблюдаемые элементы изолированы от самого маршрутизатора. Маршрутизатор уничтожает маршрутизируемый компонент, когда он больше не нужен, и инъецируемый ActivatedRoute умирает вместе с ним.
Не стесняйтесь отказаться от подписки. Это безвредно и никогда не бывает плохой практикой.
Ответ 2
Компонент будет уничтожен, и маршрутизаторState станет неучтенным, когда маршрутизатор перейдет к другому маршруту, что сделает их бесплатными для сбора мусора, включая наблюдаемые.
Если вы передадите ссылки на этот компонент другим компонентам или службам, компонент не будет собирать мусор, и подписка будет активна, но я уверен (без проверки), что наблюдаемый будет завершен маршрутизатор при навигации и отмена подписки.
Ответ 3
Как выигрышный ответ автоматически цитирует о subscriptions
- 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();
}
}