Доступ к $ scope на фабрике AngularJS?
Я новичок в AngularJS и нахожу его очень интересным, но я немного неясен в следующей ситуации.
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;
})
Я получаю ошибку, когда я назначить $scope
и использовать возвращаемые данные, есть ли в любом случае я могу назначить возвращаемые данные $scope
?
7 ответов:
обычно вы не используете
$scope
внутри фабрики, обслуживания или поставщика. Обычно, вы бы вернутьpromise
(возвращено$http
), а затем обрабатывать обещание в контроллере (где у вас есть$scope
).factory.edit = function(id){ return $http.get('?controller=store&action=getDetail&id=' + id); }
контроллер функция:
$scope.edit = function(id) { deleteFac.edit(id).then(function(response) { $scope.something = response.model; }); }
Я думаю, вы имели в виду это:
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; });
тогда в вашем контроллере вы делаете:
function MyController($scope, deleteFac){ deleteFac.edit($scope.id, function(data){ //here you have access to your scope. }); }
следующий трюк очень плохая практика, но вы можете использовать его, если вы спешите:
обмен
$scope
с:angular.element('[ng-controller=CtrlName]').scope()
лично я хотел бы использовать область с завода, поэтому вместо того, чтобы перемещать все, я бы передал область в качестве параметра от клиента, который вызывает завод.функция.)(
также у меня была такая же проблема при попытке использовать $scope.смотреть.(..) поскольку мы не можем использовать непосредственно $ scope с заводов или служб, но я хотел, чтобы это работало таким образом, поэтому я просто обновил свою функцию, чтобы иметь область в качестве параметра и позволить клиенту фабрики отправить $масштаб. Так, это было бы мое решение:
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>
Я надеюсь, что это может помочь. С уважением.
Я думаю, что это самое чистое решение:
Дайте мне знать, если есть проблемы или улучшения.
(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(); } } })();
.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; })
Я знаю, что этот вопрос старый, но это то, что сработало для меня
app.factory('myFactory',function(){ let toRet = { foo: foo } return toRet; function foo(){ // This function needs to use passed scope. let $scope = toRet.$scope; // Do stuff with $scope. } }); app.controller('myController',function($scope,myFactory){ myFactory.$scope = $scope; /* We could just pass $scope as a parameter to foo, but this is for cases where for whatever reason, you cannot do this. */ myFactory.foo(); });