Ich habe eine "AppService", die ich verwende, um die Interaktion zwischen allen meinen Komponenten (Formulare, Navigationen, etc) zu behandeln.angular2 Zerstörung von Subskriptionen auf Sicht zerstören
Mein Dienst verfügt über viele Ereignisemitter, die von den Komponenten abonniert werden (Ergebnisse, Element ausgewählt, Formular gebucht usw.).
Wenn eine neue Ansicht angezeigt wird, abonniert sie die appService-Ereignisse, die sie benötigt. Nun ist das Problem, wenn ich zu einer anderen Ansicht (Formular) navigiere, die nicht mehr benötigte Ansicht wird zerstört, aber ihre Abonnements werden immer noch aufgerufen ...! Ich finde, dass ich auf alle Subskriptionen referenziere und explizit einen massiven Textbaustein für eine einfache Aufgabe abbestelle. Was mache ich falsch? Wie kann ich dies verdeutlichen?
Beispielcode:
export class VendorsForm {
constructor(private appService: AppServiceMain)
{
this.appService.onSearchResultSelected$.subscribe((selectedEntity) => {
//detailed view of this item
this.model = selectedEntity;
this.appService.setFormIsShowingDetail();
})
});
}
}
jetzt in einer anderen Komponente:
export class CustomersForm {
constructor(private appService: AppServiceMain)
{
this.appService.onSearchResultSelected$.subscribe((selectedEntity) => {
//detailed view of this item
this.model = selectedEntity; this.appService.setFormIsShowingDetail();
})
});
}
}
nur als Referenz, hier ist der Service und die Ereignis Aufruf Komponenten:
export class AppServiceMain {
public onSearchResultSelected$: EventEmitter<IEntity>;
setSelectedEntity(ent: IEntity)
{
this.formstate = states.EntitySelected;
this.onSearchResultSelected$.emit(ent);
}
Ereignis aufrufen Komponente
export class ResultsComponent {
rowDblClick(ev$)
{
this.appService.setSelectedEntity(ev$.data);
}
Ich verstehe, wie diese suscriptions zu entfernen, wenn ich will. Das Problem ist, dass meine Formulare ziemlich groß und funktional sind und ich Tonnen von Nicht-Standard-Referenzen habe. Gibt es nicht eine Möglichkeit, automatisch zu hören, wenn die Ansicht zerstört wird? Ich finde das alles manuell zu zerstören, um ziemlich fehleranfällig zu sein.
kleine Bemerkung: meine ResultsComponent und AppService sind beide immer lebendig und Sigle Instanz – user5328504
Könnten Sie klären, warum die Implementierung 'ngOnDestroy' Methode für Sie nicht funktioniert? Für den Fall, dass Sie verpasst haben: [OnDestroy] (https://angular.io/docs/ts/latest/guide/lifecycle-hooks.html) – leovrf