我正在尝试一个异步http请求,在我的应用程序加载之前加载一些数据,所以我在$ routeProvider中使用一个解决方案,这是我的MainController中的一个http请求。由于某些原因,我不断收到错误:[$ inject:unpr]未知提供者:appDataProvider< - appData其中appData是我做我的http请求。我使用AngularJS v 1.2.5。 这里是我尝试的代码和两个方法,都给出相同的错误: 方法#1 MainController.js
var MainController = ['$scope','$location','appData',function($scope,$location,appData){ console.log(appData.data); } ]; MainController.loadData = { appData: function($http,MainFactory){ var aid = MainFactory.extractAid($location); return $http({method: 'GET',url: URL_CONST + aid}); } };
app.js
var app = angular.module('HAY',['ngRoute']); app.config(function($routeProvider) { $routeProvider .when('/',{ redirectTo: '/pages/alerts' }) .when('/pages/:pageName',{ templateUrl: function(params) { return 'views/pages/' + params.pageName + '.html'; },controller: MainController,resolve: MainController.loadData }) .otherwise({ redirectTo: '/pages/alerts' }); });
我尝试更改名称,以防它是一个冲突的系统保留关键字,但没有运气。由于某种原因,appData从不被识别
方法#2
我也试过改变它像这样:
app.js
var app = angular.module('HEY',resolve: { appData: ['$http','MainFactory',function($http,MainFactory) { var aid = MainFactory.extractAid($location); return $http({method: 'GET',url: URL_CONST + aid}); }] } }) .otherwise({ redirectTo: '/pages/alerts' }); });
MainController.js
var MainController = ['$scope',appData){ console.log(resolvedData); } ];
但是结果完全一样。这是否与角1.2.5有关?
这是一个来自别人的工作版本
http://mhevery.github.io/angular-phonecat/app/#/phones
这里是代码:
function PhoneListCtrl($scope,phones) { $scope.phones = phones; $scope.orderProp = 'age'; } PhoneListCtrl.resolve = { phones: function(Phone) { return Phone.query(); },delay: function($q,$defer) { var delay = $q.defer(); $defer(delay.resolve,1000); return delay.promise; } } angular.module('phonecat',['phonecatFilters','phonecatServices','phonecatDirectives']). config(['$routeProvider',function($routeProvider) { $routeProvider. when('/phones',{templateUrl: 'partials/phone-list.html',controller: PhoneListCtrl,resolve: PhoneListCtrl.resolve}). otherwise({redirectTo: '/phones'}); }]);
解:
问题不在于以前使用不同版本的AngularJS。
以下是使用上述代码的修复程序。
>在app.js中,您需要将控制器声明为控制器:
‘MainController’和NOT作为控制器:MainController甚至
虽然你有var MainController = app.controller(‘MainController’,
….)。
>第二个也是最大的事情是在我的index.html中我宣布了我的
控制器已经如此:
的index.html
body ng-app =“HEY”controller =“MainController”/ body
这是导致整个未知的提供程序错误显然,角度不会告诉你,你已经声明了您正在使用的控制器来解决它,这将导致一个奇怪的错误与解决无关。
我希望这可以帮助有可能有同样问题的人。
路由
.when('/view/proposal/:id',{ controller : 'viewProposalCtrl',templateURL : 'tmpls/get/proposal/view',resolve : viewProposalCtrl.resolveViewProposal })
调节器
var viewProposalCtrl = angular.module('proposal.controllers') .controller('viewProposalCtrl',['$scope','contacts','details','rationale',contacts,details,rationale){ $scope.contacts = contacts; $scope.details = details; $scope.rationale = rationale; // [ REST OF CONTROLLER CODE ] }); // proposalSrv is a factory service viewProposalCtrl.resolveViewProposal = { contacts : ['$route','proposalSrv',function($route,proposalSrv){ return proposalSrv.get('Contacts',$route.current.params.id) .then(function(data){ return data.data.contacts; },function(){ return []; }); }],details : ['$route',proposalSrv){ return proposalSrv.get('Details',$route.current.params.id) .then(function(data){ return data.data.details; },function(){ return {}; }); }],rationale : ['$route',proposalSrv){ return proposalSrv.get('Rationale',$route.current.params.id) .then(function(data){ return data.data.rationale; },function(){ return {}; ] }] };
现在我想起来,当我开发我的应用程序时,我确实有一个问题,不知道为什么当我命名我的解决函数“解决”。这给了我一个问题:
.when('/path',{ // stuff here resolve : myCtrlr.resolve })
但这没有:
.when('/path',{ //stuff here resolve : myCtrlr.myResolveFn })
另一个可能性
我唯一可以想到的其他事情是,您从$ http呼叫中返回承诺,然后尝试使用appData.data尝试使用.then函数或其他函数(.success,.error)到从承诺中检索信息。