Ich habe meinen Listener mit der Funktion $ on für ein $ Broadcast-Ereignis registriert
$scope.$on("onViewUpdated", this.callMe);
und ich möchte diesen Listener basierend auf einer bestimmten Geschäftsregel abmelden. Mein Problem ist jedoch, dass ich die Registrierung nach der Registrierung nicht mehr aufheben kann.
Gibt es in AngularJS eine Methode, um die Registrierung eines bestimmten Listeners aufzuheben? Eine Methode wie $, mit der dieses Ereignis abgemeldet wird, ist möglicherweise $ off. Das kann ich also basierend auf der Geschäftslogik sagen
$scope.$off("onViewUpdated", this.callMe);
und diese Funktion wird nicht mehr aufgerufen, wenn jemand das Ereignis "onViewUpdated" sendet.
Vielen Dank
EDIT : Ich möchte den Listener von einer anderen Funktion abmelden. Nicht die Funktion, bei der ich sie registriere.
Antworten:
Sie müssen die zurückgegebene Funktion speichern und aufrufen, um sich vom Ereignis abzumelden.
Dies ist im Quellcode zu finden :) zumindest in 1.0.4. Ich werde nur den vollständigen Code posten, da er kurz ist
Siehe auch die Dokumente .
quelle
Bei den meisten Antworten scheinen sie zu kompliziert zu sein. Angular hat Mechanismen zum Aufheben der Registrierung eingebaut.
Verwenden Sie die Abmeldungsfunktion, die zurückgegeben wird von
$on
:quelle
$scope.$on
die Registrierung nicht manuell aufgehoben werden muss$destroy
. Ein besseres Beispiel wäre die Verwendung von a$rootScope.$on
.Dieser Code funktioniert für mich:
quelle
EDIT: Der richtige Weg, dies zu tun, ist in der Antwort von @ LiviuT!
Sie können den Bereich von Angular jederzeit erweitern, um solche Listener wie folgt zu entfernen:
Und so würde es funktionieren:
Und hier ist ein Plunker davon in Aktion
quelle
Nach dem Debuggen des Codes habe ich meine eigene Funktion erstellt, genau wie die Antwort von "blesh". Das habe ich also getan
Wenn Sie meine Funktion jetzt an $ Rootscope anhängen, steht sie allen meinen Controllern zur Verfügung.
und in meinem Code mache ich
Vielen Dank
EDIT: Der AngularJS-Weg, dies zu tun, ist in der Antwort von @ LiviuT! Wenn Sie jedoch den Listener in einem anderen Bereich abmelden möchten und gleichzeitig keine lokalen Variablen erstellen möchten, um Verweise auf die Abmeldefunktion beizubehalten. Dies ist eine mögliche Lösung.
quelle
Die Antwort von @ LiviuT ist fantastisch, aber es scheint, als würden sich viele Leute fragen, wie sie von einem anderen $ -Bereich oder einer anderen Funktion aus wieder auf die Abreißfunktion des Handlers zugreifen können, wenn Sie sie von einem anderen Ort als dem, an dem sie erstellt wurde, zerstören möchten. @ Рустем Мусабековs Antwort funktioniert einfach gut, ist aber nicht sehr idiomatisch. (Und hängt davon ab, was ein privates Implementierungsdetail sein soll, das sich jederzeit ändern kann.) Und von da an wird es nur noch komplizierter ...
Ich denke, die einfache Antwort hier besteht darin, einfach einen Verweis auf die Abreißfunktion (
offCallMeFn
in seinem Beispiel) im Handler selbst zu führen und sie dann basierend auf einer bestimmten Bedingung aufzurufen. Vielleicht ein Argument, das Sie in das Ereignis aufnehmen, das Sie senden oder ausstrahlen. Handler können sich so abreißen, wann immer Sie wollen, wo immer Sie wollen, und die Samen ihrer eigenen Zerstörung mit sich herumtragen. Wie so:Zwei Gedanken:
selfDestruct
, sobald die Selbstmordmission abgeschlossen ist.quelle
Registrieren Sie einen Hook, um Ihre Listener abzumelden, wenn die Komponente entfernt wird:
quelle
Falls Sie den Listener mehrmals ein- und ausschalten müssen, können Sie eine Funktion mit
boolean
Parameter erstellenquelle
'$ on' selbst gibt die Funktion zum Aufheben der Registrierung zurück
Sie können die Funktion unregister () aufrufen, um die Registrierung dieses Listeners aufzuheben
quelle
Eine Möglichkeit besteht darin, den Hörer einfach zu zerstören, sobald Sie damit fertig sind.
quelle