Accès à $ scope dans l'usine AngularJS?

Je suis nouveau chez AngularJS et je trouve cela très intéressant, mais je suis un peu incertain quant à la situation suivante.

app.factory('deleteFac', function($http){ var factory = {}; factory.edit = function(id){ $http.get('?controller=store&action=getDetail&id=' + id). success(function(data, status){ /** got an error on the following when i use return data; and i get data undefined in the controller which i get it because its doing a ajax call you don't get data until the call first. **/ $scope.detail = data; }) } return factory; }) 

Je reçois une erreur lorsque j'attribue à $scope et j'utilise des données de retour, est-ce que de toute façon, je peux attribuer les données de retour à la $scope ?

Vous n'utilisez généralement pas de $scope dans une usine, un service ou un fournisseur. Généralement, vous devriez retourner la promise (retourné par $http ) et ensuite gérer la promesse dans un contrôleur (où vous avez $scope ).

 factory.edit = function(id){ return $http.get('?controller=store&action=getDetail&id=' + id); } 

Fonction contrôleur:

 $scope.edit = function(id) { deleteFac.edit(id).then(function(response) { $scope.something = response.model; }); } 

Je suppose que vous vouliez dire cela:

 app.factory('deleteFac', function($http){ var service = {}; factory.edit = function(id, success, error){ var promise = $http.get('?controller=store&action=getDetail&id=' + id); if(success) promise.success(success); if(error) promise.error(error); }; return service; }); 

Ensuite, dans votre contrôleur, vous faites:

 function MyController($scope, deleteFac){ deleteFac.edit($scope.id, function(data){ //here you have access to your scope. }); } 

L'astuce suivante est une très mauvaise pratique, mais vous pouvez l'utiliser si vous êtes pressé:

Échangez la angular.element('[ng-controller=CtrlName]').scope() $scope avec: angular.element('[ng-controller=CtrlName]').scope()

Je pense que c'est la solution la plus propre:

Faites-moi savoir s'il y a un problème ou une amélioration.

 (function(){ angular.controller('controllerName', controllerName); controllerName.$inject = ['$scope', factory]; function controllerName($scope, factory){ var vm = this; vm.data = factory.alertPopup(); } angular.factory('factory', factory); factory.$inject = ['externalServices']; function factory(externalServices){ return { returnData : returnData } function returnData(){ return externalServices.whatever(); } } })(); 

Personnellement, je voudrais utiliser la portée de l'usine, donc, au lieu de tout déplacer, je passais la portée comme paramètre du client qui appelle factory.function ().

Aussi, j'avais ce même problème lorsque j'essayais d'utiliser $ scope.watch (…) car nous ne pouvons pas utiliser directement la portée des usines ou des services, mais je voulais que cela fonctionne de cette façon, c'est pourquoi je viens de mettre à jour mon Fonction pour avoir la portée comme paramètre et laisser le client de l'usine envoyer la portée $. Donc, ce serait ma solution:

 var app = angular.module("myApp", []); app.factory('MyFactory', function($http) { var factory = {}; //This is only for my own issue I faced. factory.Images = {}; factory.myFunction = function(id, scope) { //This is an example of how we would use scope inside a factory definition scope.details = "Initial Value"; //In my case I was having this issue while using watch scope.$watch('details' , function(newValue, oldValue) { if(oldValue){ scope.log = "Details was updated to : " +newValue; } }); scope.details = "My Id is: "+id; }; return factory; }); //Controller: Factory's Client. app.controller("MyController", ['$scope', 'MyFactory', function($scope, MyFactory) { MyFactory.myFunction(5, $scope); }]); 
 <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script> <div ng-app="myApp" ng-controller="MyController"> <span>{{details}} </span> <hr> <p>{{log}} </p> </div> 
 .factory('POPUP', function($ionicLoading, $ionicPopup) { var self = this; // THIS BLOCK SCREEN ! for loading ! Be carefoull !! ( deprecated: assign this to a var for security) self.showLoading = function(title, message, scope){ scope.loading = true; return $ionicLoading.show({ content: message, showBackdrop: false }); }; self.hideLoading = function(title, message, scope){ scope.loading = false; return $ionicLoading.hide(); }; // NOT BLOCK SCREEN- SIMPLE ALERTS - Standards popups self.showAlert = function(title, message, callback){ var alertPopup = $ionicPopup.alert({ title: title, template: message }); alertPopup.then(function(res) { console.log('callback popup'); if (callback){ callback(); } }); }; self.showConfirm = function(objectPopup, callback){ if (objectPopup === undefined){ objectPopup = { title: 'test confirm Popup', template: 'Message test Confirm POPUP' }; } var alertPopup = $ionicPopup.confirm(objectPopup); alertPopup.then(function(res) { if (res) { callback(true); } else { callback(false); } }); }; return self; })