Angular $ http返回数据,但不适用于范围

时间:2015-02-22 06:28:08

标签: javascript angularjs

角度来说,我有这个工厂

.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();
})

如果我从http请求中调用了响应,我获取了数据,但由于某种原因,范围数据不会更新。

我见过控制器看起来像这样的例子

Users.getUsers().then(function(data) {
    $scope.users = data;
});

但是根据我的理解,我不应该因为$http已经回复了承诺。我错过了什么吗?我需要涉及$q吗?

2 个答案:

答案 0 :(得分:3)

这将有效:

 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;
});

答案 1 :(得分:0)

您的getUsers函数仍在返回一个承诺,因为它返回$http.get的值。所以,是的,您分配给$scope.users的价值是承诺。根据上面的示例,您必须处理将值设置为$scope.users的承诺:

Users.getUsers().then(function(data) {
    $scope.users = data;
});