Ответ 1
Подумайте о модулях и инъекциях зависимостей.
Итак, скажем, у вас есть эти три файла
<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: передается функция-конструктор (мы можем назвать ее классом) и возвращает экземпляр класса.
- поставщик: самый гибкий и настраиваемый, поскольку он дает вам доступ к функциям вызовов инжектора при создании экземпляра службы
- 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'])
Возможно, вы захотите следовать другой стратегии и вставить модуль в модуль директив
Обратите внимание, что аннотация для синтаксиса inline-зависимостей одинакова для почти всего. Директиве вводится одна и та же служба книг.
Обновлено Plunker: http://plnkr.co/edit/mveUM6YJNKIQTbIpJHco?p=preview