我尝试加载一些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 });
答案 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的其他新人。非常感谢所有回复他们评论的人。我真的很尊重这个社区,因为它对帮助别人的态度很好:)。