Я использую данные из службы RESTful на нескольких страницах. Поэтому я использую для этого фабрики angular. Итак, мне нужно было получить данные один раз с сервера, и каждый раз, когда я получаю данные с помощью этой определенной службы. Прямо как глобальные переменные. Вот образец:
var myApp = angular.module('myservices', []);
myApp.factory('myService', function($http) {
$http({method:"GET", url:"/my/url"}).success(function(result){
return result;
});
});
В моем контроллере я использую эту службу как:
function myFunction($scope, myService) {
$scope.data = myService;
console.log("data.name"+$scope.data.name);
}
Он отлично работает для меня в соответствии с моими требованиями. Но проблема в том, что когда я перезагружаю свою веб-страницу, служба снова вызывается и запрашивает сервер. Если в промежутке выполняется какая-то другая функция, которая зависит от «определенной службы», она выдает ошибку типа «что-то не определено». Поэтому я хочу подождать в своем скрипте, пока служба не загрузится. Как я могу это сделать? Есть ли способ сделать это в angularjs?
источник
function myFunction($scope, myService) { var myDataPromise = myService.getData(); myDataPromise.then(function(result) { $scope.data = result; console.log("data.name"+$scope.data.name); }); console.log("This will get printed before data.name inside then. And I don't want that."); }
для новичков вы также можете использовать обратный вызов, например:
К вашим услугам:
.factory('DataHandler',function ($http){ var GetRandomArtists = function(data, callback){ $http.post(URL, data).success(function (response) { callback(response); }); } })
В вашем контроллере:
DataHandler.GetRandomArtists(3, function(response){ $scope.data.random_artists = response; });
источник
К вашему сведению, здесь используется Angularfire, поэтому он может немного отличаться для другой службы или другого использования, но должен решить тот же isse $ http. У меня была та же проблема, единственное решение, которое мне подходило, лучше всего заключалось в объединении всех сервисов / фабрик в одно обещание в области. На каждом маршруте / представлении, которые требовали загрузки этих сервисов и т. Д., Я помещаю любые функции, требующие загруженных данных, внутри функции контроллера, т.е. myfunct () и основной app.js при запуске после аутентификации.
myservice.$loaded().then(function() {$rootScope.myservice = myservice;});
и в представлении я только что сделал
ng-if="myservice" ng-init="somevar=myfunct()"
в первом / родительском элементе представления / оболочке, чтобы контроллер мог запускать все внутри
myfunct()
не беспокоясь о проблемах с асинхронными обещаниями / порядком / очередью. Я надеюсь, что это поможет кому-то с теми же проблемами, что и я.
источник
У меня была такая же проблема, и ничего, если бы они работали для меня. Вот что сработало ...
app.factory('myService', function($http) { var data = function (value) { return $http.get(value); } return { data: data } });
а затем функция, которая его использует ...
vm.search = function(value) { var recieved_data = myService.data(value); recieved_data.then( function(fulfillment){ vm.tags = fulfillment.data; }, function(){ console.log("Server did not send tag data."); }); };
В сервисе нет необходимости, но я думаю, что это хорошая практика для расширяемости. Большая часть того, что вам понадобится для одного, будет для любого другого, особенно при использовании API. В любом случае я надеюсь, что это было полезно.
источник