Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angularjs 角度:是否使用$http中的数据设置工厂?(不能在工厂对象中使用$http.get吗?)_Angularjs - Fatal编程技术网

Angularjs 角度:是否使用$http中的数据设置工厂?(不能在工厂对象中使用$http.get吗?)

Angularjs 角度:是否使用$http中的数据设置工厂?(不能在工厂对象中使用$http.get吗?),angularjs,Angularjs,我希望有一个从我的数据库返回用户的工厂 我是这样定义工厂的: angular.module('myapp') .factory('UserFactory', function ($http, $q, $cookieStore, AuthTokenFactory) { function profile () { var deferred = $q.defer(); $http.get('/getprofile') .sucess(functio

我希望有一个从我的数据库返回用户的工厂

我是这样定义工厂的:

angular.module('myapp')
  .factory('UserFactory', function ($http, $q, $cookieStore, AuthTokenFactory) {

    function profile () {
      var deferred = $q.defer();
      $http.get('/getprofile')
        .sucess(function (data, status, headers, config) {
          deferred.resolve(data);
        })
        .error(function (data, status, headers, config) {
          deferred.reject(data);
        });

      console.log('something');
      return deferred.promise;   
    }; 

    var user = {
      profile: profile
    };

    return user;
但是,稍后当我尝试访问用户对象的属性时,在控制器中,如下所示:

$scope.user = UserFactory; 
我尝试访问
user.name
(由我的数据库返回)我得到
TypeError:undefined不是一个函数


为什么会这样?或者,如何使用服务中的数据设置工厂属性?

getprofile方法是异步的,它返回一个承诺。您需要使用promise API分配用户:

UserFactory.profile().then(function(response) {
     $scope.user = reponse.data;
});
另外,您不需要$q,因为$http()已经返回了一个承诺:

function profile () {
    return $http.get('/getprofile');
}
我会:

angular.module('myapp')
  .factory('UserFactory', function ($http, $cookieStore, AuthTokenFactory) {

    var request;
    var user = {};

    user.ctrl = function(callback) {
      request = $http.get('/getprofile')
        .sucess(function (data, status, headers, config) {
          user.name = data.name;
         // etc
         return callback(user)
        })
        .error(function (data, status, headers, config) {
          // handle your error
        });
       return request
    };
    user.isReady = function() { (!request) ? true : false };

    return user;
};

然后,您可以调用“创建”用户的ctrl键,并使用isReady函数来确保http调用完成,或者使用回调函数。

您在哪里分配
用户
名称
属性?我所能看到的是,您正在为用户分配一个
profile
属性,这是一个函数。您似乎没有执行该函数,但即使执行了,它也没有为
用户
对象分配任何新属性……我喜欢这个想法,但通过将isReady函数放在视图中,他可以处理(如果他想在加载时显示某个元素)?对于加载ui框,我不会将其放在就绪函数中。我将为此创建一个指令。或者使用$httpInterceptorYes是的,这是它,它可以工作。但是有两个问题:如果我想更改用户信息,(比如从声明了
UserFactory.profile()
的控制器,我该怎么做。换句话说,我能读写
UserFactory.profile()吗.name
属性?如何同步它,以便在控制器中执行某些操作时,实际更新控制器中的属性和实际服务器上的属性?是的,您可以写入$Scope上的用户对象谢谢。还有一个(相关)问题。您提到不需要
$q
。我在网上找到了这个模式,但它能更简洁地完成(不使用
$q
)吗?