为什么我的Angular服务中的$ http.get()未定义?

时间:2014-03-13 10:43:51

标签: json angularjs service rootscope

我尝试加载一些JSON并使用$ rootScope存储它,以便它在控制器之间保持不变。当我运行我的应用程序时,我收到以下错误:

TypeError: Cannot call method 'get' of undefined

get方法完美运行,直到我尝试引入$ rootScope ...任何想法?

我的服务如下:

  1 /**
  2  * Service to get the quiz data from a JSON source
  3  */
  4 app.factory('quizService', ['$rootScope', function ($scope, $rootScope, $http) {
  5     var promise;
  6     var service = {
  7         getQuiz: function($scope, $http) {
  8             if ( !promise ) {
  9                 promise = $http.get('QuizFileName.quiz').then(function (response) {
 10                     return response.data;
 11                 });
 12             }
 13             return promise;
 14         }
 15     };
 16     return service;
 17 }]);

我的控制器看起来像这样:

  7     // Get Quiz data from service
  8     quizService.getQuiz().then(function(data) {
  9         $scope.quiz = data;
 10
 11         // Redirect to scores if already completed this
 12         if($scope.quiz.complete === true) {
 13             $location.path('scores');
 14         }
 15     });

3 个答案:

答案 0 :(得分:7)

您在定义工厂时使用'阵列模式'。您应该在函数中使用的每个服务都有一个字符串,但只有一个。

也就是说,你做的是

app.factory('quizService', ['$rootScope', function ($scope, $rootScope, $http) {
    //insert code
}]);

但你应该做的是

app.factory('quizService', ['$scope', '$rootScope', '$http', function ($scope, $rootScope, $http) {
    //insert code
}]);

AngularJS会将使用字符串命名的函数映射到参数。试试看,看看它是否解决了你的问题。

编辑:啊,Reboog711的答案在解决问题时更有意义,我不知道错过了代码的后半部分。但是我要留下这个答案,因为你还应该修改工厂定义。

答案 1 :(得分:3)

getQuiz是工厂内的一个功能:

getQuiz: function($scope, $http) {

当您调用getQuiz时,不会将任何参数传递给它:

quizService.getQuiz()

$ http未定义,因为您调用它而不将任何参数传递给它。 Angular不会将项目注入您手动调用的函数中。它只会使用AngularJS自身调用的函数 - 例如控制器或工厂函数。

所以,你有几个选择。一种是将$ scope和$ http参数传递给函数,如下所示:

quizService.getQuiz($scope, $http)

我确信这会解决问题,但肯定会是一种奇怪的方法。

我可能会从函数定义中删除$ scope和$ http函数:

 getQuiz: function() {

然后确保修改工厂定义:

app.factory('quizService', ['$scope','$rootScope','$http', function ($scope, $rootScope, $http) {

如果没有此修改,Angular服务将不会传递到您的函数中。

然后,当您在函数内部访问$ http时,它应该访问传递给工厂的值,该值不应该是未定义的。

答案 2 :(得分:2)

好的,Reboog711让我走上了正确的轨道,我需要修改我的工厂定义以包含$ http,我之前曾试图这样做,但错误地把它放在一起就像这样:

'$rootScope, $http'

不要这样做,这是坏事和错误!但是Reboog711的回答也给了我错误,因为我认为你不能以我们想到的方式使用$ scope。

正确(或有效)的解决方案是:

app.factory('quizService', ['$rootScope', '$http', function ($rootScope, $http) {

我希望这有助于Angular的其他新人。非常感谢所有回复他们评论的人。我真的很尊重这个社区,因为它对帮助别人的态度很好:)。

相关问题