Używam niektórych danych, które pochodzą z usługi RESTful na wielu stronach. Więc używam do tego fabryk kątowych. Tak więc musiałem raz pobrać dane z serwera i za każdym razem, gdy otrzymuję dane za pomocą tej zdefiniowanej usługi. Podobnie jak zmienne globalne. Oto próbka:
var myApp = angular.module('myservices', []);
myApp.factory('myService', function($http) {
$http({method:"GET", url:"/my/url"}).success(function(result){
return result;
});
});
W moim kontrolerze korzystam z tej usługi jako:
function myFunction($scope, myService) {
$scope.data = myService;
console.log("data.name"+$scope.data.name);
}
Działa dobrze dla mnie, jak na moje wymagania. Ale problem polega na tym, że po ponownym załadowaniu mojej strony internetowej usługa zostanie ponownie wywołana i poprosi o serwer. Jeśli pomiędzy wykonaniem jakiejś innej funkcji, która jest zależna od „zdefiniowanej usługi”, pojawia się błąd, na przykład „coś” jest niezdefiniowane. Dlatego chcę poczekać w moim skrypcie, aż usługa zostanie załadowana. Jak mogę to zrobić? Czy w ogóle można to zrobić w angularjs?
źródło
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."); }
dla nowych osób możesz również skorzystać z połączenia zwrotnego, na przykład:
W Twojej służbie:
.factory('DataHandler',function ($http){ var GetRandomArtists = function(data, callback){ $http.post(URL, data).success(function (response) { callback(response); }); } })
W kontrolerze:
DataHandler.GetRandomArtists(3, function(response){ $scope.data.random_artists = response; });
źródło
FYI, to używa Angularfire, więc może się nieco różnić dla innej usługi lub innego zastosowania, ale powinno rozwiązać ten sam problem, który ma $ http. Miałem ten sam problem, jedynym rozwiązaniem, które pasowało mi najlepiej, było połączenie wszystkich usług / fabryk w jedną obietnicę dotyczącą zakresu. Na każdej trasie / widoku, który wymagał załadowania tych usług / itp., Umieszczam wszelkie funkcje, które wymagają załadowanych danych w funkcji kontrolera, tj. Myfunct () i główna aplikacja.js podczas uruchamiania po uwierzytelnieniu
myservice.$loaded().then(function() {$rootScope.myservice = myservice;});
iw widoku, który właśnie zrobiłem
ng-if="myservice" ng-init="somevar=myfunct()"
w pierwszym / nadrzędnym elemencie / opakowaniu widoku, aby kontroler mógł uruchomić wszystko wewnątrz
myfunct()
bez martwienia się o asynchroniczne obietnice / zamówienia / problemy z kolejką. Mam nadzieję, że pomoże to komuś z tymi samymi problemami, co ja.
źródło
Miałem ten sam problem i żaden, jeśli te zadziałały. Oto, co zadziałało ...
app.factory('myService', function($http) { var data = function (value) { return $http.get(value); } return { data: data } });
a funkcja, która go używa, to ...
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."); }); };
Usługa nie jest konieczna, ale myślę, że jest to dobra praktyka w zakresie rozszerzalności. Większość tego, czego będziesz potrzebować do jednego, będzie potrzebna do innego, zwłaszcza podczas korzystania z interfejsów API. W każdym razie mam nadzieję, że to było pomocne.
źródło