我在多个页面中使用来自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);
}
根据我的要求,它对我来说工作得很好。但这里的问题是,当我在我的网页中重新加载时,服务将再次被调用并请求服务器。如果在中间执行一些依赖于“已定义的服务”的其他函数,则会给出类似"something“is undefined的错误。所以我想在我的脚本中等待,直到服务加载完成。我该怎么做呢?在angularjs中有这样做吗?
发布于 2014-07-06 10:59:03
对于不熟悉此功能的人,您还可以使用回调,例如:
在您的服务中:
.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;
});
发布于 2015-07-07 07:25:15
我也遇到了同样的问题,如果这些方法对我有效,那就没有问题了。以下是确实有效的方法……
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的时候。无论如何,我希望这能对你有所帮助。
发布于 2015-11-12 06:31:03
仅供参考,这是在使用Angularfire,因此对于不同的服务或其他用途,它可能会有所不同,但应该可以解决相同的isse $http。我有同样的问题,唯一适合我的解决方案,最好的是将所有服务/工厂组合成一个范围内的单一承诺。在需要加载这些服务/等的每个路由/视图上,我将需要加载数据的任何函数放在控制器函数中,即myfunct()和主app.js
myservice.$loaded().then(function() {$rootScope.myservice = myservice;});
在我看来我就是这么做的
ng-if="myservice" ng-init="somevar=myfunct()"
在第一个/父视图元素/包装器中,以便控制器可以运行其中的所有内容
myfunct()
无需担心异步承诺/订单/队列问题。我希望这能帮助那些和我有同样问题的人。
https://stackoverflow.com/questions/18421830
复制相似问题