2014-03-13 41 views
1

我想加載一些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  }); 

回答

2

OK,Reboog711把我在正確的軌道上,我需要修改我廠定義,包括$ HTTP,我以前曾試圖做到這一點,卻誤把它一起這樣的:

'$rootScope, $http' 

唐不要這樣做,這是壞的和錯誤的!但Reboog711的答案也給了我錯誤,因爲我認爲你不能以我們兩人認爲的方式使用$ scope。

正確(或工作)的解決方案是:

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

我希望這可以幫助其他的新人角。非常感謝所有回覆他們評論的人。我非常尊重這個社區,因爲它對幫助他人的態度很好:)

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

+!用於捕捉數組符號問題。 – JeffryHouser

+0

謝謝。有沒有替代數組模式來定義工廠? –

+0

我個人使用這種模式,每次我寫角碼,因爲它被設計爲生存縮小。我個人建議你繼續使用它。正在發生的事情是,在縮小之後,你可能會以'app.factory('quizService',['$ http',function(a){..}]);'結尾,因爲縮小會將變量減少爲像可能。字符串沒有改變,所以角度檢查第一個字符串,並知道變量'a'實際上是'$ http'。 –

3

getQuiz是工廠內部的功能:

getQuiz: function($scope, $http) { 

當你調用getQuiz,你不傳遞任何參數進去:

quizService.getQuiz() 

$ HTTP是不確定的,因爲你不使用將任何參數傳遞給它。 Angular不會將項目注入到手動調用的函數中。它只會使用AngularJS自己調用的函數 - 比如控制器或工廠函數。

所以,你有幾個選擇。一是在$範圍和$ HTTP參數傳遞到函數,就像這樣:

quizService.getQuiz($scope, $http) 

我敢肯定,這將解決這一問題,但它是肯定的一個奇怪的做法。

我可能會刪除$範圍和$ HTTP功能進行功能定義的:

getQuiz: function() { 

然後確保你修改你的工廠的定義:

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

沒有這個修改中,角度服務不會傳遞到你的函數中。

然後,當你在函數內部訪問$ http時,它應該訪問傳入工廠的值,這個值不應該是未定義的。

+0

我很懊惱自己錯過了這個!你是對的,我需要爲定義添加$ http。 –

相關問題