我知道http请求正在运行,因为我从服务器接收数据,但$scope.catalogue
始终未定义。我猜是因为它是在结果从服务器返回之前分配的。我虽然在处理服务中的异步内容,但是我已经处理好了吗?
angular.module('catalogue', [])
.factory('Catalogue', ['$http', function($http){
return {
getCatalogue: function(){
$http.get('./server.php').then(function(response){
return response
});
},
setCatalogue: function(JSON){
$http.post('./server.php', JSON).success(function(){return 'successfully set data'});
}
}
}])
然后在我的控制器中
$scope.catalogue = Catalogue.getCatalogue();
答案 0 :(得分:4)
你需要回复承诺:
getCatalogue: function(){
return $http.get('./server.php')
}
在你的代码中你做了
Catalogue.getCatalogue().then(function(response){
$scope.catalogue = response;
});
答案 1 :(得分:1)
你可以使用角度承诺更好地保持关注点分离。 像这样:
angular.module('myapp',[])
.service('Github', function($http, $q)
{
this.getRepositories = function()
{
var deferred = $q.defer();
$http.get('https://api.github.com/users/defunkt')
.success(function(response)
{
// do stuffs with the response
response.username = response.login + ' ' + response.name;
// like filtering, manipulating data, decorating data found from from api
// now pass the response
deferred.resolve(response);
}).error(function(response)
{
deferred.resolve(response);
});
return deferred.promise;
}
})
.controller('MainCtrl', function($scope,Github) {
Github.getRepositories().then(function(dt){
$scope.user = dt;
});
});
我刚为demo创建了一个plunker:http://plnkr.co/edit/r7Cj7H