2013-08-13 1 views
4

Dans un contrôleur angulaire, je suis en train de raccorder un service de douille Web. Lorsque la portée des contrôleurs est détruite, je veux évidemment supprimer l'abonnement.

Est-il sûr de passer la portée actuelle à ma fonction d'abonnement de service afin qu'il puisse supprimer automatiquement à la portée détruire? Si je ne le fais pas alors chaque contrôleur qui se connecte à un écouteur de socket doit également se souvenir de nettoyer.

Fondamentalement est-il sûr de passer le $ scope actuel à une fonction de service ou y a-t-il une meilleure façon de le faire?

Répondre

4

J'avais le même besoin dans mon projet. Voici l'objet retourné dans une fabrique AngularJS (qui initialise WebSocket). La méthode onmessage désinscrit automatiquement un callback si vous lui transmettez le scope associé au second argument.

io = 
    onmessage: (callback, scope) -> 
    listeners.push callback 
    if scope then scope.$on "$destroy", => @offmessage callback 
    offmessage: (callback) -> listeners.remove callback 

L'équivalence de JavaScript est donnée ci-dessous.

var io = { 
    onmessage: function(callback, scope) { 
    var _this = this; 
    listeners.push(callback); 
    if (scope) { 
     scope.$on("$destroy", function() { 
     _this.offmessage(callback); 
     }); 
    } 
    }, 
    offmessage: function(callback) { 
    listeners.remove(callback); 
    } 
}; 
+1

Merci, à peu près tout ce que je suis allé avec. – redsquare

2

Je ne passerais pas la portée. Au lieu de cela, je voudrais explicitement, dans votre contrôleur, brancher le désabonnement.

De http://odetocode.com/blogs/scott/archive/2013/07/16/angularjs-listening-for-destroy.aspx:

$scope.$on("$destroy", function() { 
    if (timer) { 
     $timeout.cancel(timer); 
    } 
}); 

Je pense que ce soit fait explicitement pas aussi magique, et plus facile à suivre la logique. Je pense que le service en ferait trop s'il devait également se désinscrire. Que faire si un contrôleur veut se désabonner tôt? Cependant, si vous avez un cas d'utilisation très spécifique qui est utilisé partout, il est préférable de transmettre l'étendue. Le temps nécessaire au service est très faible, essentiellement lorsque le contrôleur s'exécute pour la première fois. le service peut écouter l'événement $ destroy.

+0

Je sais que je peux faire ce qui précède. J'essayais de le garder un peu sec et de composer un meilleur moyen. Que faire si j'ai plus de 50 contrôleurs qui en ont besoin? Beaucoup de code répété, chance d'oublier etc? Quel est le raisonnement derrière votre opinion? – redsquare

+0

@redsquare C'est un bon point. J'ai mis à jour ma réponse –

Questions connexes