J'ai inscrit mon auditeur à un événement de diffusion $ à l'aide de la fonction $ on
$scope.$on("onViewUpdated", this.callMe);
et je souhaite désinscrire cet écouteur en fonction d'une règle métier particulière. Mais mon problème est qu'une fois enregistré, je ne peux plus le désinscrire.
Existe-t-il une méthode dans AngularJS pour désinscrire un auditeur particulier? Une méthode comme $ on qui désenregistre cet événement, peut être $ off. Donc, sur la base de la logique métier, je peux dire
$scope.$off("onViewUpdated", this.callMe);
et cette fonction cesse d'être appelée lorsque quelqu'un diffuse l'événement "onViewUpdated".
Merci
EDIT : Je veux désinscrire l'auditeur d'une autre fonction. Pas la fonction où je l'enregistre.
Réponses:
Vous devez stocker la fonction retournée et l'appeler pour vous désinscrire de l'événement.
Cela se trouve dans le code source :) au moins dans 1.0.4. Je vais juste poster le code complet car c'est court
Consultez également la documentation .
la source
En regardant la plupart des réponses, elles semblent trop compliquées. Angular a intégré des mécanismes de désinscription.
Utilisez la fonction de désinscription renvoyée par
$on
:la source
$scope.$on
n'est pas nécessaire de l'enregistrer manuellement$destroy
. Un meilleur exemple serait d'utiliser a$rootScope.$on
.Ce code fonctionne pour moi:
la source
EDIT: La bonne façon de le faire est dans la réponse de @ LiviuT!
Vous pouvez toujours étendre la portée d'Angular pour vous permettre de supprimer de tels écouteurs comme ceci:
Et voici comment cela fonctionnerait:
Et voici un plongeur en action
la source
Après avoir débogué le code, j'ai créé ma propre fonction, tout comme la réponse de "blesh". C'est donc ce que j'ai fait
donc en attachant ma fonction à $ rootscope maintenant elle est disponible pour tous mes contrôleurs.
et dans mon code je fais
Merci
EDIT: La manière AngularJS de le faire est dans la réponse de @ LiviuT! Mais si vous souhaitez désenregistrer l'écouteur dans une autre étendue et en même temps, ne pas créer de variables locales pour conserver les références de la fonction de désenregistrement. C'est une solution possible.
la source
@ La réponse de LiviuT est impressionnante, mais semble laisser beaucoup de gens se demander comment accéder à nouveau à la fonction de suppression du gestionnaire à partir d'une autre portée ou fonction $, si vous souhaitez la détruire d'un endroit autre que celui où elle a été créée. La réponse de @ Рустем Мусабеков fonctionne très bien, mais n'est pas très idiomatique. (Et repose sur ce qui est censé être un détail d'implémentation privé, qui pourrait changer à tout moment.) Et à partir de là, cela devient juste plus compliqué ...
Je pense que la réponse facile ici est de simplement porter une référence à la fonction de démontage (
offCallMeFn
dans son exemple) dans le gestionnaire lui-même, puis de l'appeler en fonction d'une condition; peut-être un argument que vous incluez sur l'événement que vous diffusez ou émettez. Les manipulateurs peuvent ainsi se détruire, quand vous voulez, où vous voulez, emportant avec vous les graines de leur propre destruction. Ainsi:Deux réflexions:
selfDestruct
dès qu'il a terminé sa mission suicide.la source
Enregistrez un hook pour désinscrire vos écouteurs lorsque le composant est supprimé:
la source
Dans le cas où vous devez activer et désactiver l'auditeur plusieurs fois, vous pouvez créer une fonction avec un
boolean
paramètrela source
'$ on' lui-même renvoie la fonction pour désinscrire
vous pouvez appeler la fonction unregister () pour désenregistrer cet écouteur
la source
Une façon consiste simplement à détruire l'auditeur une fois que vous en avez terminé.
la source