Mon application complexe à partir d'onglets que chacun d'eux a une portée différente. Quand je ferme un onglet, j'ai déclenché l'événement de 'Close_Tab' et tous les contrôleurs ont
element.remove() // remove the tab from the DOM. $scope.destroy()
qui devraient attraper cet événement.
Quand j'ai dit tous les contrôleurs, je veux dire tous les onglets ouverts. Le problème est que si je ferme l'onglet et que j'écris:
$rootScope.$on('Close_Tab', function (event, data)
la portée n'est pas supprimée !! Quand j'ai débogué l'application, j'ai vu que l'onglet fermé obtenait toujours l'événement.
Quelqu'un a une idée?
3 Réponses :
$ rootScope. $ on ()
renvoie une fonction qui désenregistrera l'auditeur.
Cette fonction doit être appelée lorsque la portée de la directive est détruite.
// add listener and hold on to deregister function var deregister = $rootScope.$on('eventName', function(event) { // your best code }); // clean up listener when directive's scope is destroyed $scope.$on('$destroy', deregister);
Salut, merci pour votre réponse. Votre réponse semble bonne mais j'ai fait détruire la portée dans l'événement $ on et ensuite j'ai essayé d'écrire cette ligne $ scope. $ On ('$ destroy', deregister); dans ce cas, mais cela ne fonctionne pas. Alors, où dois-je détruire l'événement?
Les écouteurs d'événements Scope doivent être enregistrés avec $ scope, pas $ rootScope. Ensuite, ils seront automatiquement supprimés lorsque la portée est détruite:
̶$̶r̶o̶o̶t̶S̶c̶o̶p̶e̶.̶$̶o̶n̶(̶'̶C̶l̶o̶s̶e̶_̶T̶a̶b̶'̶,̶ ̶f̶u̶n̶c̶t̶i̶o̶n̶ ̶(̶e̶v̶e̶n̶t̶,̶ ̶d̶a̶t̶a̶)̶ $scope.$on('Close_Tab', function (event, data)
Le problème est que $ emit est dans un niveau $ rootscope, donc le $ scope n'a pas du tout reçu l'événement.
Il ne faut pas faire $ emit
sur $ rootScope
, utilisez plutôt $ broadcast
.
Un événement peut être diffusé aux enfants du scope ou émis aux parents de portée.
Le problème est que $ emit est dans un niveau $ rootscope, donc le $ scope n'a pas du tout reçu l'événement.
Il ne faut pas faire $ emit
sur le $ rootScope
, utiliser $ broadcast
.
Ce qui a résolu ce problème a été d'appeler la fonction deregister () dans l'événement $ on. parce que $ on event renvoie la fonction de désenregistrement de l'événement et tout ce que nous devons faire est d'appeler cette fonction.
J'ai donné la réponse ci-dessous. si vous obtenez une réponse, veuillez cocher le signe droit. @tehila