Сервисы AngularJS: Factory, Service, Provider - создание и расширение
AngularJS предоставляет такие типы сервисов, как Factory, Service, Provider. Из статьи вы узнаете как инстанцировать и расширять эти сервисы (decoration). Все сервисы (внутренние тоже) AngularJS создает с помощью объекта $provide
. Этот же объект позволяет в дальнейшем и расширять все существующие сервисы метод decorator()
. Всю дополнительную информацию вы найдете в официальном руководстве.
Все сервисы - Singleton
'ы
Все типы сервисов - Factory
, Service
, Provider
являются синглтонами (Singleton
), поэтому любое изменение состояния сервиса будет сохранено во всем приложении.
Примечание
Все типы сервисов поддерживают конфигурацию через метод config()
:
APP.config(function(serviceName) {
serviceName.method('value');
});
* Для доступа сервис-провайдеру следует добавлять к имени префикс (окончание) Provider
.
Фабрика (Factory)
Самый простой и часто используемый тип сервиса. Фабрика не накладывает каких-либо ограничений на правила формирования и тип возвращаемых данных. Один из подходов при создании фабрики - это шаблон открытого модуля.
APP.factory('someFactory', function() {
va privateVariable = 'private variable',
secondVariable = true;
function getPrivate() {
return privateVariable;
}
return {
variable: 'public variable',
getPrivate: getPrivate
};
});
Сервис (Service)
Сервис. в отличие от фабрики, вызывает конструктор ф-ции для инстанцирования экземпляра объекта. Конструктор также будет вызван только единожды.
APP.service('someService', function() {
var privateVariable = 'private variable';
this.publicVariable = 'public value';
this.getPrivate = function() {
return privateVariable;
};
});
Провайдер (Provider)
Провайдер представляет из себя расширенную фабрику. Обычно провайдер используется для описания доступа к ресурсу через JSONP. Провайдер ожидает в возвращаемом объекте функцию $get
.
APP.provider('user', function() {
var privateVariable = 'private variable';
return {
setPrivate: function(val) {
privateVariable = val;
},
$get: function() {
function getPrivate() {
return privateVariable;
}
return {
publicVariable: 'public value',
getPrivate: getPrivate
};
}
};
});
// В отличие от прочих сервисов, провайдеру добавляется префикс `Provider`
APP.config(function(userProvider) {
fooProvider.setPrivate('New value from config');
});
Примеры сервис-провайдеров: $routeProvider, $locationProvider, ...
Декорация сервисов
Для расширения методов сервисов в AngularJS имеется сервис $provide
, и его метод decorator()
. В callback ф-цию этого метода передается оригинальный экземпляр сервиса ($delegate
), который мы и расширяем.
APP.config(function($provide) {
$provide.decorator('someService', function($delegate) {
$delegate.extendMethod = function() {
return 'расширяем сервис someService методом extendMethod';
};
return $delegate;
});
});