2014-09-20 77 views
0

我想從我的控制器調用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.datapls = function() { 
    UserInfo.getStuff().success(function(response){ 
     console.log(response); 
     $scope.loaduser.push(response); 
    }); 
} 

謝謝!我很感激幫助。

回答

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

謝謝!我閱讀了$ q文檔,並將其修改爲我的代碼,並且工作正常。 – DaveS 2014-09-20 22:36:24

+0

優秀:-)這是一個奇怪的習慣,承諾,但積木:-) – Darren 2014-09-20 22:38:19

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); 
    }); 
} 
相關問題