typescript - Behöver du avregistrera dig från en prenumeration på router-parametrar i Angular?
När du prenumererar på frågeparametrar i en komponent, behöver du avprenumerera? Jag försöker undvika ett minnesläckage.
Prenumeration med variabel för unsubscribe()
subscription$: Subscription
constructor(private route: ActivatedRoute) {}
ngOnInit() {
this.subscription$ = this.route.queryParams.subscribe(
(params: any): void => {
// ... Do stuff here ...
}
)
}
ngOnDestroy() {
if (this.subscription$ !== undefined || this.subscription$ !== null) {
this.subscription$.unsubscribe()
}
}
Prenumeration utan variabel för unsubscribe()
constructor(private route: ActivatedRoute) {}
ngOnInit() {
this.route.queryParams.subscribe(
(params: any): void => {
// ... Do stuff here ...
}
)
}
Vilket är en bättre lösning?
Svar #1
ActivatedRoute avslutar prenumerationen för alla sina prenumeranter när komponenten förstörs.
Du kan titta på dokumentationen: https://angular.io/guide/router-tutorial-toh#observable-parammap-and-component-reuse
När man prenumererar på ett observerbart i en komponent ordnar man nästan alltid att avsluta prenumerationen när komponenten förstörs.
Det finns några undantagbara observables där detta inte är nödvändigt. ActivatedRoute-observables är bland undantagen.
ActivatedRoute och dess observables är isolerade från själva Routern. Routern förstör en routad komponent när den inte längre behövs och den injicerade ActivatedRoute dör med den.
Svar #2
Du kan hitta denna fråga som referens
Angular är det nödvändigt att avprenumerera från denna.activatedRoute-prenumerationer
men jag skulle säga att avregistrera sig när du har prenumererat på något alltid är en bra praxis. Det finns olika sätt att avregistrera sig; vi kan göra det genom att använda bara en extra variabel för prenumerationen
Jag föredrar alltid att avsluta prenumerationen i denna situation också