Javascript 无法读取未定义的角度工厂的属性
我对Angular factory有异议,我尝试了很多方法,但都是一样的 这是一个错误:Javascript 无法读取未定义的角度工厂的属性,javascript,angularjs,Javascript,Angularjs,我对Angular factory有异议,我尝试了很多方法,但都是一样的 这是一个错误: TypeError: Cannot read property 'getSchedule' of undefined at new <anonymous> (http://127.0.0.1:4767/js/ctrls/main.js:3:19) at d (https://ajax.googleapis.com/ajax/libs/angularjs/1.2.2
TypeError: Cannot read property 'getSchedule' of undefined
at new <anonymous> (http://127.0.0.1:4767/js/ctrls/main.js:3:19)
at d (https://ajax.googleapis.com/ajax/libs/angularjs/1.2.26/angular.min.js:35:36)
at Object.instantiate (https://ajax.googleapis.com/ajax/libs/angularjs/1.2.26/angular.min.js:35:165)
at https://ajax.googleapis.com/ajax/libs/angularjs/1.2.26/angular.min.js:67:419
at link (https://ajax.googleapis.com/ajax/libs/angularjs/1.2.26/angular-route.min.js:7:248)
at N (https://ajax.googleapis.com/ajax/libs/angularjs/1.2.26/angular.min.js:54:372)
at g (https://ajax.googleapis.com/ajax/libs/angularjs/1.2.26/angular.min.js:47:256)
at https://ajax.googleapis.com/ajax/libs/angularjs/1.2.26/angular.min.js:46:377
at https://ajax.googleapis.com/ajax/libs/angularjs/1.2.26/angular.min.js:48:217
at F (https://ajax.googleapis.com/ajax/libs/angularjs/1.2.26/angular.min.js:52:28) <ng-view class="app-content ng-scope" ng-hide="loading">
并尝试使用此工厂/服务
services.factory('tvRage', function($http) {
var tvRage = {};
tvRage.getSchedule = function() {
return $http({
method: 'get',
url: 'http://services.tvrage.com/feeds/fullschedule.php',
params: {
country: 'US',
key: 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
}
}).then(function (response) {
return response.data;
});
};
return tvRage;
});
用这个控制器
controllers.controller('MainCtrl', ['$scope','$http','tvRage',
function ($scope, $http, tvRage) {
tvRage.getSchedule().success(function(data){
var parser = new X2JS();
var x2js = parser.xml_str2json(data);
$scope.request = x2js;
}).error(function(){
alert('nouuu');
});
}
]);
$http在控制器中运行时,但从功能方面来看,我认为该请求应该在工厂中。您正在从工厂返回
$q
承诺。它没有方法success
和error
,它们是由$http
在返回的httpPromise中添加的特殊函数(这只是QPromise的扩展)
您可以通过删除然后
链接将工厂更改为返回httpPromise:
return $http({
method: 'get',
url: 'http://services.tvrage.com/feeds/fullschedule.php',
params: {
country: 'US',
key: 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
}
});
或者使用标准q promise函数将其链接到控制器中,然后/捕获
controllers.controller('MainCtrl', ['$scope','$http','tvRage',
function ($scope, $http, tvRage) {
tvRage.getSchedule().then(function(data){
var parser = new X2JS();
var x2js = parser.xml_str2json(data);
$scope.request = x2js;
}).catch(function(){
alert('nouuu');
});
}
]);
但对于您得到的特定错误,您的DI列表可能在原始代码中与参数列表不匹配。通过记录控制器中注入的tvarge
和其他参数来重新验证。这很容易发生,因为原始代码中的参数不匹配。例:-
.controller('MainCtrl', ['$scope','tvRage', function ($scope, $http, tvRage){
//Now tvRage will be undefined and $http will be tvRage.
工作演示
angular.module('app',[]).controller('ctrl',['$scope','$http','tvRage',',
函数($scope、$http、tvRage){
tvRage.getSchedule().success(函数(数据){
console.log(数据)
}).错误(函数(){
警报(“nouuu”);
});
}
]).factory('tvRage',函数($http){
var-tvRage={};
tvRage.getSchedule=函数(){
返回$http({
方法:“get”,
网址:'http://services.tvrage.com/feeds/fullschedule.php',
参数:{
国家:"美国",,
密钥:“XXXXXXXXXXXXXXXXXXXXXXXXX”
}
});
};
返回tvRage;
});;代码>
它们在同一个文件中吗?如果没有,您很可能忘记将该文件包含在索引中。html@Fals不,它们不是,但一切都是联系在一起的。承诺没有成功的方法,这就是问题所在!我也在想,但是。。。这并不能解释错误信息,是吗?它试图访问未定义的getSchedule
,这意味着tvarge
未定义。呵呵,你说得对。。我没有仔细查看错误消息。我假设问题可能是.controller('MainCtrl',['$scope','tvRage',function($scope,$http,tvRage){
谢谢您的建议,但不起作用。只有一个更改是错误为“undefined is not function”@Jayme对您显示的代码帮助不大,我们只能假设并尝试帮助您处理问题中的代码。请参阅我答案中的演示,它应该可以正常工作。请使用演示链接复制此问题。控制器DI和参数在您的原始代码中看起来如何。所有的优点都是原始代码。应用程序、控制器和工厂在租用文件。我试着把工厂放在控制器旁边,它工作了!它一定是邪恶的魔法或什么的。:-D出了记录-我是一个有棱角的新手
.controller('MainCtrl', ['$scope','tvRage', function ($scope, $http, tvRage){
//Now tvRage will be undefined and $http will be tvRage.