Ich finde viele Beispiele , in denen ActivatedRoute
Observable wie params
oder url
abonniert haben , aber nicht abgemeldet.
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);
}
- Werden die Routenobjekte und Abonnements automatisch zerstört und bei jeder Komponentenerstellung neu erstellt?
- Muss ich mich darum kümmern, mich von diesen
Observable
abzumelden? - Wenn nicht, können Sie erklären, was mit dem Baum der ActivatedRoute-Objekte in passiert
Router
.routerState
?
Antworten:
Aus den Dokumenten :
Wenn Sie ein Observable in einer Komponente abonnieren, können Sie sich fast immer abmelden, wenn die Komponente zerstört wird.
Es gibt einige außergewöhnliche Observable, bei denen dies nicht erforderlich ist. Die ActivatedRoute-Observablen gehören zu den Ausnahmen.
Die ActivatedRoute und ihre Observablen sind vom Router selbst isoliert. Der Router zerstört eine geroutete Komponente, wenn sie nicht mehr benötigt wird, und die injizierte ActivatedRoute stirbt damit.
Fühlen Sie sich trotzdem frei, sich abzumelden. Es ist harmlos und niemals eine schlechte Praxis.
quelle
unsubscribe
wenn Sie melden sichActivatedRoute
inapp.component
?app.component
es so lange lebt, wie die App lebt, besteht dort ohnehin keine wirkliche Notwendigkeit, sich abzumelden.Die Komponente wird zerstört und der RouterState wird nicht mehr referenziert, wenn der Router zu einer anderen Route navigiert. Dadurch können sie den Müll einschließlich der beobachtbaren Daten sammeln.
Wenn Sie Verweise auf diese Komponente an andere Komponenten oder Dienste weitergeben, wird die Komponente nicht durch Müll gesammelt und das Abonnement bleibt aktiv, aber ich bin sicher (ohne zu überprüfen), dass das Observable beim Navigieren vom Router vervollständigt wird weg und veranlassen, dass das Abonnement kündigt.
quelle
ActivatedRoute
ist nach jeder Routennavigation eine neue Instanz, oder? Wie würde dann das Abonnement für geänderte Routenparameter funktionieren? Vielleicht könnten Sie den besonderen Lebenszyklus von erklärenActivatedRoute
? Wird derRouterState
Baum nach jeder Navigation aus der Wurzel neu erstellt? Wenn die Komponente nach der Navigation zerstört wird, kann dies zu Flackern führen!?Da der Gewinn Antwort Zitate über das
subscriptions
zuActivatedRoute
, Angularunsubscribes
automatisch.Falls Sie wissen , wie man
unsubscribe
ausObservables
: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 = this.activatedRoute.params.subscribe( params => { }); } ngOnDestroy() { console.log("Component will be destroyed"); this.paramsSubscription.unsubscribe(); } }
quelle
Wenn Sie eine Komponente abonnieren, müssen Sie sich fast immer abmelden, wenn die Komponente zerstört wird. Das Abonnieren der aktivierten Routenparameter erfordert jedoch kein Abbestellen, da der Router das Abonnement zerstört, wenn es nicht mehr benötigt wird.
quelle
HTTP-Observables-Anrufe und Router-Observables müssen nicht manuell abbestellt werden. Wenn Sie mit einer anderen Art von Observable oder Ihrer eigenen Observable umgehen, sollten Sie dies auf ngOnDestroy () tun. Sie rufen dazu die Methode unsubscribe () im Suscription-Objekt auf, in dem Sie Ihre Observable in der Komponente speichern.
quelle