Eckig/RxJs Wann sollte ich mich Abmelden von `Abonnement`
Wann sollte ich mit der Speicherung der Subscription
Instanzen und berufen unsubscribe()
während der NgOnDestroy Lebenszyklus und Wann kann ich Sie einfach ignorieren?
Speichern Sie alle Abonnements, bringt eine Menge Durcheinander in die Komponente-code.
HTTP-Client-Handbuch ignorieren Abonnements wie diese:
getHeroes() {
this.heroService.getHeroes()
.subscribe(
heroes => this.heroes = heroes,
error => this.errorMessage = <any>error);
}
In der gleichen Zeit Route & Navigation-Anleitung sagt, dass:
Schließlich, wir werden navigieren woanders. Der router wird diese Komponente entfernen aus DOM und zerstören es. Wir müssen zu reinigen, nachdem uns vor, dass das passiert. Insbesondere müssen wir Abmelden, bevor Eckige zerstört die Bauteile. Andernfalls könnte es einen Speicherverlust.
Wir die Abmeldung aus unserer
Observable
imngOnDestroy
Methode.
private sub: any;
ngOnInit() {
this.sub = this.route.params.subscribe(params => {
let id = +params['id']; //(+) converts string 'id' to a number
this.service.getHero(id).then(hero => this.hero = hero);
});
}
ngOnDestroy() {
this.sub.unsubscribe();
}
Subscription
s zu http-requests
können ignoriert werden, da Sie nur rufen onNext
einmal und dann rufen Sie onComplete
. Die Router
stattdessen fordert onNext
wiederholt und vielleicht nie nennen onComplete
(nicht sicher...). Gleiches gilt für Observable
s aus Event
s. Also ich denke, diese sollte unsubscribed
.Der stream abgeschlossen (oder nicht abgeschlossen) unabhängig von der Beobachtung, dass die Vollendung. Die Rückrufe (die Beobachter) zur Verfügung gestellt, um die Abo-Funktion nicht feststellen, ob die Ressourcen verteilt werden. Es ist der Aufruf zu
subscribe
selbst, dass potenziell reserviert Ressourcen im upstream.InformationsquelleAutor Sergey Tihon | 2016-06-24
Du musst angemeldet sein, um einen Kommentar abzugeben.
--- Edit 4 - Zusätzliche Ressourcen (2018/09/01)
In einer aktuellen episode von Adventures in Angular Ben Lesh und Gemeinde Bell diskutieren die Fragen, wie/Wann Abmelden in einer Komponente. Die Diskussion beginnt bei ungefähr 1:05:30.
Gemeinde erwähnt
right now there's an awful takeUntil dance that takes a lot of machinery
Shai Reznik erwähntAngular handles some of the subscriptions like http and routing
.Antwort Ben erwähnt, dass es jetzt diskutiert wird, zu ermöglichen Observablen, um hook in das Eckige Bauteil-Lebenszyklus-Ereignisse und die Gemeinde schlägt vor, eine Beobachtbare lifecycle-Ereignisse, die eine Komponente zeichnen konnten, als ein Weg, zu wissen, Wann die komplette Observablen gepflegt als Komponente des internen Zustands.
Das heißt, wir benötigen vor allem Lösungen, die jetzt also hier sind einige andere Ressourcen.
Empfehlung für die
takeUntil()
Muster aus RxJs core-team-Mitglied Nicholas Jamieson und eine tslint Regel zu helfen, es durchzusetzen. https://blog.angularindepth.com/rxjs-avoiding-takeuntil-leaks-fb5182d047efLeichte npm-Paket, das macht eine Observable operator nimmt eine Komponenteninstanz (
this
) als parameter und automatisch abmeldet währendngOnDestroy
.https://github.com/NetanelBasal/ngx-take-until-destroy
Andere Variante der oben mit etwas besserer Ergonomie, wenn Sie nicht tun, AOT baut (aber wir sollten alle tun, die AOT jetzt).
https://github.com/smnbbrv/ngx-rx-collector
Benutzerdefinierte Richtlinie
*ngSubscribe
funktioniert wie async-Leitung schafft aber eine eingebettete Ansicht in Ihrer Vorlage, so können Sie sich an die "gelöste" Wert in der Vorlage.https://netbasal.com/diy-subscription-handling-directive-in-angular-c8f6e762697f
Ich schon erwähnt, in einem Kommentar zu Nicholas' blog, der über-Nutzung der
takeUntil()
könnte ein Zeichen sein, dass Ihre Komponente wird versuchen, zu viel zu tun, und dass die Trennung Ihre vorhandenen Komponenten in Funktion und Präsentations - Komponenten berücksichtigt werden sollten. Sie können dann| async
die Observable von der Feature-Komponente in eineInput
von der Präsentations-Komponente, was bedeutet, dass keine Abonnements erforderlich sind überall. Lesen Sie mehr über diesen Ansatz hier--- Edit 3 - Die "Offizielle" Lösung (2017/04/09)
Ich Sprach mit der Gemeinde Bell über diese Frage NGConf (ich habe sogar zeigte ihm diese Antwort, die er sagte, war richtig) aber er sagte mir das docs-team für Eckige hatten eine Lösung auf diese Frage, die unveröffentlicht sind (obwohl Sie arbeiten daran, es genehmigt). Er erzählte mir auch, könnte ich update meine Antwort mit dem bevorstehenden offiziellen Empfehlung.
Die Lösung, die wir alle sollten gehen nach vorne ist, um eine
private ngUnsubscribe = new Subject();
Feld, um alle Komponenten, die.subscribe()
AufrufeObservable
s in Ihrer Klasse code.Dann rufen wir
this.ngUnsubscribe.next(); this.ngUnsubscribe.complete();
in unseremngOnDestroy()
Methoden.Die geheime Zutat (wie bereits von @metamaker) ist zu nennen
takeUntil(this.ngUnsubscribe)
vor jedem unserer.subscribe()
fordert die Garantie für alle Abonnements werden bereinigt, wenn die Komponente zerstört wird.Beispiel:
Hinweis: Es ist wichtig, die
takeUntil
Betreiber wie die Letzte zu verhindern, dass Lecks mit zwischen observablen in der operator-Kette.--- Edit 2 (2016/12/28)
Quelle 5
Angular-tutorial das Routing Kapitel nun besagt Folgendes: "Der Router verwaltet die observablen, die es bietet und lokalisiert die Abonnements. Die Abonnements werden bereinigt, wenn die Komponente zerstört wird, zum Schutz gegen memory leaks, so brauchen wir nicht bis zur Abmeldung von der route params Beobachten." - Daneben Rajcok
Hier ein Diskussion auf der Github-issues für den Winkel-docs über Router Observablen wo Ward Bell erwähnt, dass sich die Klärung all dies ist in den Werken.
--- Edit 1
Quelle 4
In diesem video von NgEurope Rob Wormald sagt auch, Sie müssen nicht abbestellen Router Observablen. Er erwähnt auch die
http
service undActivatedRoute.params
in diesem video von November 2016.--- Ursprüngliche Antwort
TLDR:
Für diese Frage gibt es (2) Arten von
Observables
- finite Wert und unendliche Wert.http
Observables
produzieren finite (1) Werte und so etwas wie eine DOM -event listener
Observables
produzieren unendliche Werte.Wenn Sie manuell aufrufen
subscribe
(nicht mit der asynchronen pipe), dannunsubscribe
aus unendlicheObservables
.Mach dir keine sorgen über finite diejenigen, die
RxJs
wird sich um Sie kümmern.Quelle 1
Habe ich spürte eine Antwort von Rob Wormald in Eckig - Gitter hier.
Er sagt (i, neu organisiert, für die Klarheit und die Betonung ist von mir)
Auch erwähnt er in diesem youtube-video auf Observablen, die
they clean up after themselves
... im Kontext von Observablen, diecomplete
(wie Versprechen, die Sie immer abgeschlossen, weil Sie erzeugt immer den Wert 1 und endet - wir haben nie besorgt über die Abmeldung von Versprechungen, um sicherzustellen, dass Sie sauber bisxhr
Ereignis-Listener, oder?).Quelle 2
Auch in der Rangle guide zu Winkel 2 es liest
Wann kommt der Satz
our Observable has a longer lifespan than our subscription
gelten?Gilt es, wenn ein Abonnement innerhalb einer Komponente, die zerstört wird, bevor (oder auch nicht 'lange' vor) der
Observable
abgeschlossen.Ich lese dies als eine Bedeutung, wenn wir abonnieren
http
Anfrage oder eine beobachtbare, das strahlt 10 Werte und unsere Komponente zerstört wird, bevor dashttp
Anforderung gibt oder die 10 Werte wurden abgegeben, wir sind immer noch ok!Wenn die Anfrage zurück oder die 10 Wert ist, schließlich emittiert der
Observable
wird beendet und alle Ressourcen bereinigt werden.Quelle 3
Wenn wir uns anschauen, dieses Beispiel aus der gleichen Rangle guide können wir sehen, dass die
Subscription
zuroute.params
erfordert einunsubscribe()
weil wir nicht wissen, Wann dieseparams
wird, ändern sich nicht mehr (emitting neue Werte).Die Komponenten können zerstört werden, indem der Navigation Weg, in dem Fall die route params wird sich wahrscheinlich noch ändern wird (Sie könnte technisch ändern, bis die Anwendung beendet ist) und die Zuweisung von Ressourcen im Abonnement würde noch zugeordnet werden, da es noch nicht ein
completion
.complete()
selbst nicht erscheinen zu bereinigen, die Abonnements. Allerdings ruftnext()
und danncomplete()
tut, ich glaubetakeUntil()
nur Stoppt, wenn ein Wert produziert wird, nicht wenn die Sequenz beendet ist.Ein kurzer test mit einem Mitglied geben
Subject
innerhalb einer Komponente und Wechsel es mitngIf
auslösenngOnInit
undngOnDestroy
zeigt, dass das Thema und seine Abonnements wird nie abgeschlossen oder werden entsorgt (angeschlossen einefinally
-operator, um das Abonnement). Ich muss rufenSubject.complete()
imngOnDestroy
, so dass die Abonnements können zu bereinigen nach sich selbst.Ihre --- Edit 3 ist sehr aufschlussreich, vielen Dank! Ich habe gerade einen Nachfolge-Frage: wenn Sie mit dem
takeUnitl
Ansatz, wir haben nie manuell Abmelden von jeder observablen? Ist das der Fall? Außerdem, warum brauchen wir rufennext()
imngOnDestroy
, warum nicht einfach anrufencomplete()
?Das ist enttäuschend; die zusätzlichen boilerplate ist ärgerlich.
Edit 3 diskutiert im Rahmen der Veranstaltungen unter medium.com/@benlesh/rxjs-dont-unsubscribe-6753ed4fda87
InformationsquelleAutor seangwright
Sie nicht brauchen, um den Haufen von Abonnements und kündigen Sie manuell. Verwenden RxJS.Thema und takeUntil combo zu handhaben Abonnements like a boss:
Alternativer Ansatz, die vorgeschlagen wurde @acumartini in den Kommentaren, verwendet takeWhile statt takeUntil. Sie können es vorziehen, beachten Sie aber, dass auf diese Weise Ihre Beobachtbare Ausführung nicht abgesagt werden ngDestroy der Komponente (z.B. wenn Sie langwierige Berechnungen oder warten Sie, bis die Daten vom server). - Methode, basierend auf takeUntil, hat nicht diesen Nachteil und führt zu sofortigen Löschung der Anfrage. Dank @AlexChe für eine ausführliche Erklärung in den Kommentaren.
So, hier ist der code:
Ich denke, dass es einen signifikanten Unterschied zwischen der Verwendung
takeUntil
undtakeWhile
. Der ehemalige kündigt von der Quelle beobachtbaren sofort, wenn Sie abgefeuert, während die letzteren kündigt nur sobald der nächste Wert wird produziert, indem die Quelle zu beobachten. Wenn die Produktion einen Wert von der Quelle beobachtbar ist eine Ressource in Anspruch nehmen kann, die Wahl zwischen den beiden kann gehen über die style-Vorlieben. Siehe zupfenvielen Dank für die Bereitstellung des interessanten plunk! Dies ist sehr Gültiger Punkt für die Allgemeine Nutzung
takeUntil
vstakeWhile
jedoch nicht für unseren speziellen Fall. Wenn wir brauchen, um sich abzumelden Zuhörer auf die Komponente Zerstörung, wir sind nur die überprüfung boolescher Wert, wie() => alive
imtakeWhile
, so dass jede Zeit - /Speicher-Operationen nicht verwendet, und der Unterschied ist ziemlich viel über styling (ofc, für diesen speziellen Fall).Sagen, in unserer Komponenten-wir schliessen uns ein
Observable
, die intern Minen einige crypto-Währung und feuert einenext
Ereignis für jeden abgebauten Münze und Bergbau eine solche Münze dauert einen Tag. MittakeUntil
werden wir die Abmeldung von der Quelle miningObservable
sofort, sobaldngOnDestroy
wird aufgerufen, während unsere Komponente Zerstörung. Damit die mining -Observable
Funktion ist in der Lage, es zu kündigen, ist die Bedienung sofort während dieses Prozesses.OTOH, wenn wir
takeWhile
imngOnDestory
setzen wir einfach den boolean-variable. Aber der BergbauObservable
Funktion könnte noch Arbeit für bis zu einem Tag, und nur dann, während esnext
aufrufen, werden Sie feststellen, dass es keine Abonnements aktiv und man muss Abbrechen.InformationsquelleAutor metamaker
Abonnement-Klasse hat ein Interessantes feature:
Können Sie ein Aggregat anlegen Abonnement-Objekt, dass Gruppen, die alle Ihre Abonnements.
Erstellen Sie dazu eine leere Abonnement und das hinzufügen von Abonnements durch Ihre
add()
Methode. Wenn Ihre Komponente zerstört wird, müssen Sie nur kündigen, wird der Aggregat-Abonnement.Keine Nachteile, ich bin mir dessen bewusst. Ich glaube nicht, dass das besser ist, nur anders.
Siehe medium.com/@benlesh/rxjs-dont-unsubscribe-6753ed4fda87 für die weitere Diskussion auf der offiziellen
takeUntil
Ansatz im Vergleich zu diesem Ansatz zu sammeln Abos und aufrufenunsubscribe
. (Dieser Ansatz scheint viel sauberer zu mir.)Ein kleiner Vorteil dieser Antwort: Sie haben nicht zu überprüfen, ob
this.subscriptions
null istNur vermeiden Sie das verketten von Methoden hinzufügen, wie
sub = subsciption.add(..).add(..)
da es in vielen Fällen unerwartete Ergebnisse github.com/ReactiveX/rxjs/issues/2769#issuecomment-345636477InformationsquelleAutor Steven Liekens
Einige der besten Praktiken bezüglich der observablen ein - /Austragungen im inneren Eckigen Komponenten:
Einem Zitat aus
Routing & Navigation
Und in Reaktion auf die folgenden links:
http
beobachtenIch sammelte einige der besten Praktiken bezüglich der observablen ein - /Austragungen im inneren Eckigen Komponenten, mit Ihnen zu teilen:
http
beobachtbaren Abmeldung ist Voraussetzung und wir sollten uns die Auswirkungen der "subscribe callback' ausgeführt wird, nachdem das Bauteil zerstört wird auf einer Fall-zu-Fall-basis. Wir wissen, dass eckige abmeldet und reinigt diehttp
beobachtbaren selbst (1), (2). Dies gilt aus der Perspektive der Ressourcen, die es erzählt nur die halbe Geschichte. Sagen wir, wir reden direkt aufrufenhttp
innerhalb einer Komponente, und diehttp
Antwort dauerte länger als nötig, so dass der Benutzer schließt die Komponente. Diesubscribe()
handler wird noch genannt werden, auch wenn die Komponente wird geschlossen und zerstört. Diese können unerwünschte Nebenwirkungen haben und im schlimmsten Szenarien, verlassen Sie den Status der Anwendung gebrochen. Es kann auch zu den Ausnahmen, wenn der code in die callback anzurufen versucht, etwas, das einfach entsorgt wurden. Aber zur gleichen Zeit, gelegentlich sind Sie erwünscht. Wie, sagen wir, Sie erstellen ein E-Mail-client und Sie auslösen einen Ton, wenn die E-Mail geschieht, indem - Sie würde immer noch wollen, dass auch dann auftreten, wenn die Komponente wird geschlossen (Acht).AsyncPipe
so viel wie möglich, weil es automatisch abmeldet aus dem beobachtbaren Komponente Zerstörung.ActivatedRoute
observablen wieroute.params
wenn Sie angemeldet sind, innerhalb einer geschachtelten (Hinzugefügt innerhalb tpl mit dem component selector) oder dynamische Komponente, da Sie möglicherweise abonniert werden oft, wie lange, wie die Eltern/host-Komponente vorhanden ist. Keine Notwendigkeit abbestellen Sie in anderen Szenarien wie bereits im obigen Zitat vonRouting & Navigation
docs.Hinweis: Über scoped services ich.e Komponenten-Anbieter, Sie werden zerstört, wenn die Komponente zerstört wird. In diesem Fall, wenn wir bekennen uns zu einer wahrnehmbaren innerhalb dieser provider ist, sollten wir Abmeldung von es mit die
OnDestroy
lifecycle-hook wird aufgerufen, wenn der service ist zerstört, laut den docs.takeUntil
(3) oder Sie können verwenden Sie diesenpm
Paket erwähnt (4) Der einfachste Weg, um sich abzumelden von Observablen in Eckige.FormGroup
observablen wieform.valueChanges
undform.statusChanges
Renderer2
service wierenderer2.listen
HostListener
wie eckige kümmert sich gut zum entfernen von Ereignis-Listenern, wenn nötig, und verhindert, dass alle möglichen Speicherverlust aufgrund von Ereignis-bindings.Eine schöne Letzte Tipp: Wenn Sie nicht wissen, ob eine observable wird automatisch gekündigt/beendet oder nicht, fügen Sie einen
complete
Rückrufsubscribe(...)
und prüfen, ob es wird aufgerufen, wenn die Komponente zerstört.ngOnDestroy
wird aufgerufen, wenn der service auf einer anderen Ebene als der root-Ebene z.B. ausdrücklich in eine Komponente, die später wieder entfernt werden. In diesen Fällen sollten Sie den Newsletter abbestellen der services inneren observablenvielen Dank für Ihren Kommentar und höflich bin ich nicht einverstanden. Wenn eine Komponente zerstört wird, die Komponente, den service und die observable werden alle GCed und die Abmeldung wird nutzlos in diesem Fall, es sei denn, Sie halten eine Referenz für die beobachtbaren überall Weg von der Komponente (Die nicht logisch zu Leck die Komponente Staaten weltweit trotz scoping-service, um die Komponente)
Wenn der Dienst nicht zerstört wird, hat ein Abonnement, um eine beobachtbare Zugehörigkeit zu einem anderen Dienst, die höher in der DI-Hierarchie, dann GC nicht auftreten. Vermeiden Sie dieses Szenario durch Abmeldung in
ngOnDestroy
, die immer dann aufgerufen wird, wenn die Leistungen zerstörten github.com/angular/angular/commit/...Überprüfen Sie die aktualisierte Antwort.
Zunächst
Feel free to unsubscribe anyway. It is harmless and never a bad practice.
und zu Ihrer Frage, es hängt davon ab. Wenn die Kind-Komponente eingeleitet wird mehrere Male (Zum Beispiel im innerenngIf
oder dynamisch geladen), müssen Sie Abmelden, um zu vermeiden, hinzufügen mehrere Abos auf den gleichen Beobachter. Sonst keine Notwendigkeit. Aber ich bevorzuge Abmeldung innerhalb der Kind-Komponente, da dies macht es mehr wiederverwendbar und isoliert aus, wie es verwendet werden könnte.InformationsquelleAutor Mouneer
Kommt es an. Wenn durch den Aufruf
someObservable.subscribe()
starten Sie das halten, einige Ressource, die müssen manuell frei, wenn der lifecycle der Komponente ist über, dann sollten Sie rufentheSubscription.unsubscribe()
um zu verhindern, dass Speicher-Leck.Let ' s nehmen einen genaueren Blick auf Ihre Beispiele:
getHero()
gibt das Ergebnishttp.get()
. Wenn Sie einen Blick in den Winkel-2 source code,http.get()
erstellt zwei Ereignis-Listener:und durch den Aufruf
unsubscribe()
Sie können die Anforderung Abbrechen sowie die Zuhörer:Beachten Sie, dass
_xhr
ist Plattform-spezifisch, aber ich denke, es ist sicher anzunehmen, dass es eineXMLHttpRequest()
in Ihrem Fall.Normalerweise, das ist genug Beweise, dass eine manuelle
unsubscribe()
nennen. Aber nach dieser WHATWG-spec, dieXMLHttpRequest()
unterliegen der garbage collection sobald es "fertig", auch wenn es Ereignis-Listener angehängt ist. Also ich denke, das ist, warum eckig 2 offizielle Handbuch behandeltunsubscribe()
und lässt GC Aufräumen der Zuhörer.Als für dein zweites Beispiel, es hängt von der Umsetzung der
params
. Ab heute, dem Winkel offiziellen Anleitung nicht mehr zeigt, Abmeldung vonparams
. Ich sah in src wieder und fand, dassparams
ist nur ein BehaviorSubject. Da keine Ereignis-Listener oder Timer verwendet wurden, und keine globalen Variablen erstellt wurden, sollte es sicher sein, weglassenunsubscribe()
.In der unteren Zeile auf Ihre Frage, rufen Sie immer
unsubscribe()
als Schutz gegen Speicherverlust, wenn Sie sicher sind, dass die Ausführung des beobachtbaren nicht erstellen Sie Globale Variablen, Ereignis-Listener hinzufügen, stellen Sie Timer, oder irgendetwas anderes tun, die Ergebnisse im Speicher-Lecks.Wenn Sie Zweifel haben, suchen Sie in der Umsetzung, die beobachtbaren. Wenn die observable geschrieben hat, einige clean-up-Logik in seine
unsubscribe()
, die in der Regel die Funktion, der zurückgegeben wird, durch den Konstruktor, dann haben Sie guten Grund, um ernsthaft über den Aufrufunsubscribe()
.InformationsquelleAutor evenstar
Winkel 2 offizielle Dokumentation bietet eine Erläuterung, wenn zu kündigen und, wenn es sicher ignoriert werden können. Haben Sie einen Blick auf diesen link:
https://angular.io/docs/ts/latest/cookbook/component-communication.html#!#bidirektional-service
Look für den Absatz mit der überschrift " Eltern und Kinder kommunizieren über eine service und dann das Blaue Feld:
Ich hoffe das hilft dir.
Der Punkt über MissionControlComponent ist nicht wirklich darüber, ob es ein Elternteil ist oder nicht, es ist, dass die Komponente selbst bietet den service. Wenn MissionControl zerstört wird, so übernimmt die den service und die Referenzen auf die Instanz des service, somit gibt es keine Möglichkeit eines Lecks.
InformationsquelleAutor Cerny
Seit seangwright Lösung (Edit 3) scheint sehr nützlich zu sein, ich fand es auch ein Schmerz, pack diese Funktion in base-Komponente, und Tipp anderen Projekt Teamkollegen zu erinnern Aufruf super() auf ngOnDestroy um diese Funktion zu aktivieren.
Diese Antwort bieten eine Möglichkeit, frei von der super-Aufruf, und machen "componentDestroyed$" a core of base-Komponente.
Dann können Sie dieses feature verwenden, frei zum Beispiel:
InformationsquelleAutor Val
Den offiziellen Edit #3 Antwort (und Varianten) funktioniert gut, aber die Sache, die mich erhält, ist die 'trüben' der business Logik, um die beobachtbaren Abonnement.
Hier ist ein anderer Ansatz mit Wrapper.
Datei subscribeAndGuard.ts wird verwendet, um erstellen Sie eine neue Beobachtbare Erweiterung zu wickeln
.subscribe()
zu wickelnngOnDestroy()
.Benutzung ist die gleiche wie
.subscribe()
, mit Ausnahme einer zusätzlichen ersten parameter verweisen auf die Komponente.Ist hier eine Komponente mit zwei Abos, eins mit dem wrapper und eine ohne. Der einzige Nachteil ist es umsetzen muss OnDestroy (mit leerer Körper, wenn gewünscht), ansonsten Eckig weiß nicht, nennen Sie die verpackte version.
Einem demo-plunker ist hier
Ein weiterer Hinweis:
Re-Edit 3 - Die "Offizielle" Lösung, dies kann vereinfacht werden durch die Verwendung von takeWhile() anstelle von takeUntil (), bevor Abonnements, und eine einfache Boolesche eher als eine andere Observable in ngOnDestroy.
InformationsquelleAutor Richard Matsen
Folgenden die Antwort von @seangwright, die ich geschrieben habe eine abstrakte Klasse, die mit "unendlich" observablen " Abonnements in Komponenten:
Es zu benutzen, verlängern Sie einfach es in Ihre Winkel-Komponente und rufen Sie die
subscribe()
- Methode wie folgt:Nimmt es auch der Fehler und die vollständige Rückrufe wie üblich, ein Beobachter-Objekt, oder nicht Rückrufe an alle. Denken Sie daran, zu nennen
super.ngOnDestroy()
wenn Sie auch die Umsetzung dieser Methode in der child-Komponente.Finden hier ein weiterer Verweis von Ben Lesh: RxJS: nicht Abmelden.
InformationsquelleAutor Mau Muñoz
Versuchte ich seangwright Lösung (Edit 3)
Ist nicht Beobachtbar, erstellt durch timer-oder Intervall.
Aber ich habe es funktioniert, indem mit einem anderen Ansatz:
InformationsquelleAutor Jeff Tham
Ich wie die letzten zwei Antworten, aber ich erlebte ein Problem, wenn die der Unterklasse referenziert
"this"
imngOnDestroy
.Ich es geändert werden, und es sieht aus wie es gelöst, das Problem.
this.ngOnDestroy = () => { f.bind(this)(); this.componentDestroyed$.complete(); };
InformationsquelleAutor Scott Williams
In der Regel müssen Sie sich Abmelden, wenn die Bauteile zerstört, sondern Eckig ist, behandeln es mehr und mehr, wie wir gehen, zum Beispiel in neue minor-version des Angular4, haben Sie diesen Abschnitt für routing-unsubscribe:
Auch das Beispiel unten ist ein gutes Beispiel von der Winkelgeschwindigkeit um eine Komponente zu erstellen und zu zerstören nach, schauen, wie die Komponente implementiert OnDestroy, wenn Sie onInit, können Sie auch implementiert Sie in Ihre Komponenten, wie implementiert
OnInit, OnDestroy
InformationsquelleAutor Alireza
Noch eine kurze Ergänzung zu den oben genannten Situationen ist:
InformationsquelleAutor kg11
Fall kündigen ist erforderlich, im folgenden Betreiber für beobachtbare Rohr-Methode kann verwendet werden,
es kann z.B. so verwendet werden:
Der Betreiber wickelt ngOnDestroy Methode der Komponente.
Wichtig: der Betreiber sollte die Letzte sein, die in beobachtbaren Rohr.
InformationsquelleAutor Oleg Polezky
im SPA-Anwendung bei ngOnDestroy Funktion (Winkel-lifeCycle) Für jede abonnieren müssen Sie Abmelden. Vorteil => zu vermeiden, dass der Staat immer zu schwer.
zum Beispiel:
in component1 :
in service:
in component2:
InformationsquelleAutor mojtaba ramezani
Für den Umgang Abonnement verwende ich ein "Unsubscriber" - Klasse.
Hier ist der Unsubscriber Klasse.
Und Sie können diese Klasse verwenden, in einer beliebigen Komponente /Service /Effekt etc.
Beispiel:
InformationsquelleAutor Pratiyush