Passage de la scope actuelle à un service AngularJS

Est-il correct de transmettre la $scope “actuelle” à un service AngularJS?

Je suis dans la situation où un service $ sait qu’il est consommé par un seul contrôleur, et j’aimerais avoir une référence à la scope du contrôleur dans les méthodes de service $ elles-mêmes.

Est-ce que c’est philosophiquement correct?

Ou je ferais mieux de diffuser des événements au $ rootScope et ensuite de les écouter avec mon contrôleur?

Pour que le contrôleur sache quand quelque chose se produit, utilisez les promesses angulars .

Pour provoquer le $apply , vous n’avez pas besoin de la scope, vous pouvez appeler $rootScope.$apply , car il n’y a pas de différence en l’appelant dans une scope spécifique ou dans la racine.

En ce qui concerne la lecture des variables, il serait préférable que vous receviez des parameters. Mais vous pouvez également le lire à partir d’une scope en tant que paramètre d’object, mais j’irais avec le paramètre, ce qui rendrait votre interface de service beaucoup plus claire.

Je dirais que si votre fonctionnalité est spécifique à un seul contrôleur, vous n’avez pas besoin d’un service.

Les tâches du contrôleur consistent à manipuler le modèle spécifique, tandis qu’un service doit traiter des tâches globales. Je préfère m’en tenir à ce paradigme au lieu de mélanger les choses.

C’est ce que disent les médecins

Un service

Les services angulars sont des services individuels exécutant des tâches spécifiques communes aux applications Web.

Manette

Dans Angular, un contrôleur est une fonction JavaScript (type / classe) utilisée pour augmenter les instances de la scope angular, à l’exclusion de l’étendue racine.

PS: En dehors de cela, si vous avez besoin de digérer, vous pouvez également injecter le $ rootScope dans votre service.

Oui. Vous pouvez transmettre $ scope au service lorsque vous l’initialisez. Dans le constructeur de service, vous pouvez affecter la scope à quelque chose comme this._scope, puis référencer l’étendue dans le service!

 angular.module('blah').controller('BlahCtrl', function($scope, BlahService) { $scope.someVar = 4; $scope.blahService = new blahService($scope); }); angular.module('blah').factory('blahService', function() { //constructor function blahService(scope) { this._scope = scope; this._someFunction() } //wherever you'd reference the scope blahService.prototype._someFunction = function() { this._scope['someVar'] = 5; } return blahService; }); 

Je pense personnellement que transmettre $scope à un service est une mauvaise idée , car cela crée une référence un peu circulaire: le contrôleur dépend du service et le service dépend de la scope du contrôleur.

En plus d’être déroutant en termes de relations, des choses comme celle-ci finissent par faire obstacle au ramasse-miettes.

Mon approche préférée consiste à placer un object de domaine dans la scope du contrôleur et à le transmettre au service. De cette façon, le service fonctionne, qu’il soit utilisé dans un contrôleur ou dans un autre service à l’avenir.

Par exemple, si le service est supposé pousser et faire éclater des éléments d’un tableau, mon code sera:

 var errors = []; $scope.errors = errors; $scope.myService = new MyService(errors); 

Le service interagit alors avec le contrôleur en opérant sur des errors . Bien sûr, je dois faire attention à ne jamais effacer la référence de l’ensemble du tableau, mais en fin de compte, c’est une préoccupation générale de JS.

Je ne voudrais jamais utiliser la diffusion, $apply et / ou des choses similaires, car à mon avis, les bonnes pratiques OO l’emporteront toujours sur la magie angular.