无法访问工厂功能(未定义不是功能)

时间:2014-09-20 18:38:47

标签: angularjs

我试图从我的控制器调用getStuff函数,但我在控制台中收到一条错误,说明" undefined不是函数"。我试图从GET返回JSON,然后将其存储在$ scope变量中。

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

var user = [];

return{
        getStuff: function(){
            user.push($http.get('api/users'));
            return user;
    },
        testPost: function(){
            return $http.post('api/users');
    }
};

});

工厂连接到控制器,如下所示

.controller('TwitterController', function($scope, $q, $interval, UserInfo) {

以及我用来调用工厂函数的$ scope函数

$scope.datapls = function() {
    UserInfo.getStuff().success(function(response){
      console.log(response);
      $scope.loaduser.push(response);
    });
}

谢谢!我很感激帮助。

2 个答案:

答案 0 :(得分:1)

您的错误是指.success()功能 - 它不存在。

看起来你正在尝试使用承诺。如果是这种情况,那么您需要从您的服务中return承诺本身。

像这样的东西(未经过测试,但是一个想法)。您希望在服务中使用$q,而不是使用控制器。

$q on AngularJS docs部分中的示例很棒。

通过这样做,您的控制器不必等待数据。一旦解决了

app.service('UserInfo', function($http, $q) {
        this.getStuff = function(){
            var deferred = $q.defer();
            $http.get('api/users').success(function(data, status) {
                deferred.resolve(data);
            }).error(function(data, status) {
                deferred.reject(data);
            });

            return deferred.promise;
        }
    }
);

在你的控制器中你可以这样做:

  UserInfo.getStuff().then(function(dataFromService){
       // dataFromService is used in here..
       $scope.loaduser.push(dataFromService);
    }, function(error) {
     // the error will come in via here
  });

答案 1 :(得分:0)

根据docs,$ http本身会返回一个承诺,您可以更改工厂功能以实现您的目标:

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

return{
        getStuff: function(){
            return $http.get('api/users'));
    },
        testPost: function(){
            return $http.post('api/users');
    }
};
});

并在控制器中:

$scope.datapls = function() {
    UserInfo.getStuff().then(function(response){
      console.log(response);
      $scope.loaduser.push(response);
    });
}