1
votes

Pourquoi destroy scope ne fonctionne pas après avoir appelé $ scope.destroy ()

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?


1 commentaires

J'ai donné la réponse ci-dessous. si vous obtenez une réponse, veuillez cocher le signe droit. @tehila


3 Réponses :


0
votes

$ 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);


1 commentaires

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?



0
votes

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.


2 commentaires

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 .



0
votes

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.


0 commentaires