Должен ли я отказаться от подписки на наблюдаемые значения 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);
}
  • Уничтожаются ли объекты маршрута и подписки автоматически и заново для каждого компонента?
  • Должен ли я заботиться о том, чтобы отписаться от тех, Observables?
  • Если нет, то можете ли вы объяснить, что происходит с деревом объектов ActivatedRoute в Router,routerState?

4 ответа

Решение

Из документов:

При подписке на наблюдаемое в компоненте вы почти всегда соглашаетесь отменить подписку, когда компонент уничтожен.

Есть несколько исключительных наблюдаемых, где это не обязательно. Наблюдаемые значения ActivatedRoute входят в число исключений.

ActivatedRoute и его наблюдаемые изолированы от самого маршрутизатора. Маршрутизатор уничтожает маршрутизируемый компонент, когда он больше не нужен, и внедренный ActivatedRoute умирает вместе с ним.

Не стесняйтесь отписаться в любом случае. Это безвредно и никогда не бывает плохой практикой.

В качестве победного ответа цитаты о subscriptions в ActivatedRouteУгловой 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();
  }

}

Компонент будет уничтожен, а routerState станет не связанным, когда маршрутизатор перейдет на другой маршрут, что освободит их для сбора мусора, в том числе наблюдаемого.

Если вы передадите ссылки на этот компонент другим компонентам или службам, компонент не будет собирать мусор, и подписка будет оставаться активной, но я уверен (без проверки), что наблюдаемое будет выполнено маршрутизатором при навигации. и отменить подписку.

Всякий раз, когда вы добавляете подписку на компонент, вам почти нужно отписаться, когда компонент уничтожается. Но подписка на параметры Активированного маршрута не требует отмены подписки, поскольку маршрутизатор уничтожает подписку всякий раз, когда она больше не нужна.

Вызовы Http Observables и Router Observables не нужно отказываться от подписки вручную. В случае, если вы обрабатываете другой вид наблюдаемого или собственное наблюдаемое, вы должны сделать это с помощью ngOnDestroy(). Вы делаете это, вызывая метод unsubscribe() внутри объекта Suscription, в котором вы храните наблюдаемое в компоненте.

Другие вопросы по тегам