Estoy usando Suscripción para obtener un parámetro de la ruta en angular. Aquí está el código:
import { Component, OnInit, OnDestroy } from '@angular/core'; import { ActivatedRoute } from '@angular/router'; import { Subscription} from 'rxjs'; @Component({ selector: 'farm-house', templateUrl: './house.component.html', styleUrls: ['./house.component.scss'] }) export class GreenhouseComponent implements OnInit, OnDestroy { private routeSub: Subscription; id: string; constructor(private route: ActivatedRoute) { this.id = ""; } ngOnInit(): void { this.routeSub = this.route.params.subscribe(params => { this.id = params['id']; }); } ngOnDestroy() { this.routeSub.unsubscribe(); } }Pero el problema es que el compilador dice:
La propiedad 'routeSub' no tiene inicializador y no está definitivamente asignada en el constructor.
Mi pregunta es, ¿cuál es la mejor manera de inicializar un objeto de suscripción?
En la mayoría de los casos, debería ser suficiente verificar la suscripción antes de darse de baja.
ngOnDestroy() { if(this.routeSub) { this.routeSub.unsubscribe(); } } En su caso, no es necesario inicializar la suscripción porque ya llamó al método de suscripción en ngOnInit() . Es posible que se produzca un error porque está llamando a cancelar la unsubscribe() directamente en la suscripción sin verificar que esté inicializado o no.
Se me ocurrió otra solución que usa Subscription.EMPTY de esta pregunta .
import { Component, OnInit, OnDestroy } from '@angular/core'; import { ActivatedRoute } from '@angular/router'; import { Subscription} from 'rxjs'; @Component({ selector: 'farm-house', templateUrl: './house.component.html', styleUrls: ['./house.component.scss'] }) export class GreenhouseComponent implements OnInit, OnDestroy { private routeSub: Subscription; id: string; constructor(private route: ActivatedRoute) { this.routeSub = Subscription.EMPTY; this.id = ""; } ngOnInit(): void { this.routeSub = this.route.params.subscribe(params => { this.id = params['id']; }); } ngOnDestroy(): void { if(this.routeSub) { this.routeSub.unsubscribe(); } } }Si declaras routeSub: any; el compilador no debería quejarse. fuente: lo vi hecho en esta publicación y trabajé para mí