我有这个工厂
.factory('Users', function($http) {
var users = [];
return {
getUsers: function() {
return $http.get("data.json")
.then(function(response) {
users = response.data;
return users;
});
},
getUser: function(id) {
for (i = 0; i < users.length; i++) {
if (users[i].id == id) {
return users[i];
}
}
return null;
}
}
})
然后将数据加载到我的控制器中
.controller('SessionsCtrl', function($scope, Users) {
$scope.users = Users.getUsers();
})
如果我console.log来自http请求的响应,则表示我正在获取数据,但是由于某种原因,范围数据将不会更新。
我看过控制器看起来像这样的例子
Users.getUsers().then(function(data) {
$scope.users = data;
});
但据我了解,由于
$http
已经返回了承诺,因此我不需要这样做。我想念什么吗?我是否需要完全参与$q
? 最佳答案
这将起作用:
getUsers: function() {
return $http.get("data.json");
},
和:
Users.getUsers().then(function(data) {
$scope.users = data.data;
});
但是,您编写的内容将无法正常工作,仅因为您无法直接从稍后将完成的操作(例如
$http
调用)中返回结果。这个问题:
getUsers: function() {
return $http.get("data.json")
.then(function(response) {
users = response.data;
return users;
});
},
是在
return users;
行执行ajax调用时,它仍在进行中,什么都还没有返回,所以对于用户来说您什么也收不到。对于您要做什么,我将使用回调: getUsers: function(callback) {
$http.get("data.json")
.then(function(response) {
users = response.data;
callback(users);
});
},
用法:
Users.getUsers(function(data) {
$scope.users = data;
});