我想在angularjs应用程序中将服务与控制器分开,我是按照以下方式完成的:
var myApp = angular.module('myApp',['restangular','ui.router','myApp.controllers','myApp.services']);
有:
controllers.js
angular.module('myApp.controllers',[]);
:
services.js
angular.module('myApp.services',[]);
:
controllers.js
我有一个与angular.module('myApp.controllers',[]).controller('ContactController', ContactController);
ContactController.$inject = [ '$scope', 'ContactService' ];
function ContactController($scope, ContactService) {
console.log("here call ctrl contact");
$scope.contacts = ContactService.getAll();
}
相关的控制器:
ContactController
此ContactService
调用单独文件中定义的服务angular.module('myApp.services',[])
.factory('ContactService', function(Restangular){
var Contacts = Restangular.all('contacts');
return {
getAll : function(){
return Contacts.getList().$object;
}
};
});
:
ContactService .js
.state('contacts', {
url: '/contacts',
templateUrl: 'templates/contacts.html',
controller: 'ContactController'
})
.state('todos', {
url: '/todos',
templateUrl: 'templates/todos.html',
controller: 'TodoController'
})
问题是当我试图调用此控制器时出现以下错误:
错误:[$ injector:unpr]未知提供者:ContactServiceProvider< - 的ContactService http://errors.angularjs.org/1.2.19/ $注射器/ unpr?P0 = ContactServiceProvider%20%3 C-%20ContactService
我该如何解决?
更新: 这是我的应用程序的结构:
我在app.js:
fieldnames
在index.html我导入了所有的js文件:
答案 0 :(得分:7)
使用m初始化模块后,angular.module('myApp.controllers', [])
再次,您不应使用第二个参数依赖项([])
所以, 在你的控制器中,
`angular.module('myApp.controllers',[])` should be `angular.module('myApp.controllers')`
所以,
angular
.module('myApp.controllers')
.controller('ContactController', ContactController);
ContactController.$inject = ['$scope', 'ContactService'];
function ContactController($scope, ContactService) {
console.log('here call ctrl contact');
$scope.contacts = ContactService.getAll();
}
这同样适用于服务/工厂,
angular.module('myApp.services')
.factory('ContactService', function(Restangular){
var Contacts = Restangular.all('contacts');
return {
getAll : function(){
return Contacts.getList().$object;
}
};
});
PS:在index.html
中看到js文件注入的顺序后,我发现了主要问题。
文件脚本的顺序错误。在ContactController
中,您使用的contactService
未在其前定义。
因此,请更改index.html
中的脚本顺序,如下所示。
<script src="js/app.js"></script>
<script src="js/services.js"></script>
<script src="js/services/ContactService.js"></script>
<script src="js/services/TodoService.js"></script>
<script src="js/controllers/HomeController.js"></script>
<script src="js/controllers/ContactController.js"></script>
<script src="js/controllers/TodoController.js"></script>
答案 1 :(得分:0)
尝试包含
angular.module('myApp.controllers',['myApp.services'])
而不是
angular.module('myApp.controllers',[])
欢呼声
答案 2 :(得分:0)