考虑模块和依赖注入。
假设你有这三个文件
<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 被传递给控制器函数,并由注入 main 应用程序模块中的服务模块提供。
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 函数的对象,该函数被传递了一个成功回调。您也可以更改它以传递错误函数。
编辑 在 cmets 中回答 @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;
}
};
}]);
将directive模块注入app.js中的主模块。
angular.module('MyApp', ['controllers', 'services', 'directives'])
您可能希望遵循不同的策略并将模块注入 directives 模块
请注意,内联依赖注释的语法几乎对所有内容都是相同的。该指令被注入相同的图书服务。
更新 Plunker:http://plnkr.co/edit/mveUM6YJNKIQTbIpJHco?p=preview