考虑模块和依赖注入。
所以,假设你有这三个文件
<script src="controllers.js"></script>
<script src="services.js"></script>
<script src="app.js"></script>
你需要三个模块
1. 主应用模块
angular.module('MyApp', ['controllers', 'services'])
.config(['$routeProvider', function($routeProvider){
$routeProvider
.when('/bookslist', {
templateUrl: 'partials/bookslist.html',
controller: "BooksListCtrl"
})
.otherwise({redirectTo: '/bookslist'});
}]);
请注意,其他两个模块被注入到主模块中,因此它们的组件可用于整个应用程序。
2.控制器模块
目前您的控制器是一个全局函数,您可能希望将其添加到控制器模块中
angular.module('controllers',[])
.controller('BooksListCtrl', ['$scope', 'Books', function($scope, Books){
Books.get(function(data){
$scope.books = data;
});
$scope.orderProp = 'author';
}]);
Books
传递给控制器功能,并由注入主应用程序模块的服务模块提供。
3. 服务模块
这是您定义Books
服务的地方。
angular.module('services', [])
.factory('Books', ['$http', function($http){
return{
get: function(callback){
$http.get('books.json').success(function(data) {
// prepare data here
callback(data);
});
}
};
}]);
有多种注册服务的方法。
- service:传递一个构造函数(我们可以称它为类)并返回该类的一个实例。
- provider:最灵活和可配置的,因为它使您可以访问注入器在实例化服务时调用的函数
- factory:传递一个注入器在实例化服务时调用的函数。
我更喜欢使用该factory
函数并让它返回一个对象。在上面的示例中,我们只返回一个带有get
传递成功回调函数的对象。您也可以更改它以传递错误函数。
编辑在评论中回答@yair 的请求,这是您将服务注入指令的方式。
4. 指令模块
我按照惯用的模式,先添加js文件
<script src="directives.js"></script>
然后定义一个新模块并注册东西,在这种情况下是一个指令
angular.module('directives',[])
.directive('dir', ['Books', function(Books){
return{
restrict: 'E',
template: "dir directive, service: {{name}}",
link:function(scope, element, attrs){
scope.name = Books.name;
}
};
}]);
将指令模块注入到.app.js
angular.module('MyApp', ['controllers', 'services', 'directives'])
您可能希望遵循不同的策略并将模块注入指令模块
请注意,几乎所有内容的语法内联依赖注释都是相同的。该指令注入了相同的 Books 服务。
更新 Plunker:http ://plnkr.co/edit/mveUM6YJNKIQTbIpJHco?p=preview