Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 无法读取未定义的角度工厂的属性_Javascript_Angularjs - Fatal编程技术网

Javascript 无法读取未定义的角度工厂的属性

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

我对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.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.