将AngularJS API服务中的值返回给控制器

时间:2015-04-25 22:38:58

标签: javascript angularjs api service factory

如果我的服务看起来像这样:

add_index :table_name , [:number, :disc, :album_id], unique: true

如何在控制器中获取app.factory('User', function($http, User) { var User = function(data) { angular.extend(this, data); }; User.prototype.create = function() { var user = this; return $http.post(api, user.getProperties()).success(function(response) { user.uid = response.data.uid; }).error(function(response) { }); }; User.get = function(id) { return $http.get(url).success(function(response) { return new User(response.data); }); }; return User; }); 函数中创建的User

目前我所拥有的是:

get()

问题是app.controller('UserCtrl', function($scope, User) { $scope.user = null; User.get($routeParams.rid).success(function(u) { $scope.user = new User(u.data); }); }); 正在获取api响应,而不是工厂中UserCtrl返回的值。我更喜欢在工厂制作新用户,而不是将api响应传递给控制器​​。

3 个答案:

答案 0 :(得分:5)

编辑:2015年5月5日

我在尝试回答deferred anti-pattern时了解了question

因此我们可以避免使用$q.defer()并使用以下代码来实现相同的结果。

服务

User.get = function(id) {
    return $http.get(url).then(function(response) {
        return new User(response.data);
    });
};

控制器

User.get($routeParams.rid).then(function(u) {
    $scope.user = u;
});

以下原始答案:

我认为您正在寻找的是$q服务,它允许您对来自异步$http服务的响应进行一些后处理,然后将其作为承诺返回给控制器。查看此处的文档https://docs.angularjs.org/api/ng/service/$q

请在您的工厂中注入$q服务并更改您的User.get功能,如下所示。

User.get = function(id) {
    var deferred = $q.defer();

    $http.get(url).success(function(response) {
        deferred.resolve(new User(response.data));
    }).error(function(error) {
        deferred.reject(error);
    });

    return deferred.promise;
};

然后在你的控制器中你可以做到

User.get($routeParams.rid).then(function(u) {
    $scope.user = u;
}, function(error) {
    //log error
});

答案 1 :(得分:0)

我认为你的回报有点搞砸了。就个人而言,我会写这样的东西

app.factory('User', function ($http) {

    var user = {
        new: function (data) {
            return $http.post(api, data);
        },
        get: function (id) {
            $http.get(url).success(function (response) {
                return user.new(response.data);
            });
        }
    };

    return user;

});

然后从你的控制器里面......

app.controller('UserCtrl', function($scope, User) {
    $scope.user = null;

    User.get($routeParams.rid).success(function(u) {
        $scope.user = u.data;
    });
});

答案 2 :(得分:0)

有类似的问题,当我有“响应”时。传递给def.resolve,从控制器抛出未定义。所以直接通过了回复并且有效。

var def = $q.defer();
$http.get('http://localhost:3000/api/services')
      .success(function (response) {
          ***def.resolve(response);***              
      })
      .error(function (error) {              
          def.reject(error);
      });
      return def.promise;