Улучшить эту документацию Просмотреть исходный код $provide
- сервис в модуле auto
Сервис $provide предоставляет набор методов для регистрации компонентов в $injector. Многие из этих функций также доступны в angular.Module.
В Angular, сервис — это одиночный объект, созданный фабрикой сервиса. Эти фабрики сервисов являются функциями, которые, в свою очередь, созданы провайдером сервиса. Провайдеры сервиса — это конструкторские функции. При их создании они должны содержать свойство, называемое $get, которое хранит функцию фабрики сервиса.
При запросе сервиса $injector отвечает за поиск соответствующего провайдера сервиса, его создание и вызов его $get фабрики сервиса для получения экземпляра сервиса.
Часто сервисы не имеют опций конфигурации, и нет необходимости добавлять методы к провайдеру сервиса. В этих случаях провайдер может быть просто конструкторской функцией со свойством $get. Для таких случаев сервис $provide предлагает дополнительные вспомогательные методы для регистрации сервисов без указания провайдера.
- provider(name, provider) - регистрирует провайдер сервиса в $injector
- constant(name, obj) - регистрирует значение/объект, доступный провайдерам и сервисам.
- value(name, obj) - регистрирует значение/объект, доступный только сервисам, а не провайдерам.
-
factory(name, fn) - регистрирует функцию фабрики сервиса, которая будет обернута в объект провайдера сервиса, чье свойство
$getбудет содержать заданную функцию фабрики. -
service(name, Fn) - регистрирует конструкторскую функцию, которая будет обернута в объект провайдера сервиса, чье свойство
$getсоздаст новый объект, используя заданную конструкторскую функцию. - decorator(name, decorFn) - регистрирует функцию декоратора, которая сможет модифицировать или заменить реализацию другого сервиса.
Дополнительную информацию и примеры см. в описаниях отдельных методов.
Методы
-
provider(name, provider);
Зарегистрировать функцию-провайдер в $injector. Функции-провайдеры — это конструкторские функции, экземпляры которых отвечают за "предоставление" фабрики для службы.
Имена провайдеров служб начинаются с имени предоставляемой службы, за которым следует
Provider. Например, служба $log имеет провайдер, называемый $logProvider.Объекты провайдеров служб могут иметь дополнительные методы, которые позволяют настраивать провайдер и предоставляемую им службу. Важно, что вы можете настроить тип создаваемой службы с помощью метода
$getили способ её работы. Например, у $logProvider есть метод debugEnabled, который позволяет указать, будет ли служба $log регистрировать отладочные сообщения в консоль или нет.Параметры
Парам Тип Подробности name stringИмя экземпляра. ПРИМЕЧАНИЕ: провайдер будет доступен под ключом
name + 'Provider'.provider Objectfunction()Если провайдер:
-
Object: то он должен иметь метод$get. Метод$getбудет вызван с помощью $injector.invoke(), когда потребуется создать экземпляр. -
Constructor: новый экземпляр провайдера будет создан с помощью $injector.instantiate(), а затем обработан какobject.
Возвращаемое значение
Objectзарегистрированный экземпляр провайдера
Примеры
Следующий пример демонстрирует, как создать простую службу отслеживания событий и зарегистрировать её с помощью $provide.provider().
// Define the eventTracker provider function EventTrackerProvider() { var trackingUrl = '/track'; // A provider method for configuring where the tracked events should been saved this.setTrackingUrl = function(url) { trackingUrl = url; }; // The service factory function this.$get = ['$http', function($http) { var trackedEvents = {}; return { // Call this to track an event event: function(event) { var count = trackedEvents[event] || 0; count += 1; trackedEvents[event] = count; return count; }, // Call this to save the tracked events to the trackingUrl save: function() { $http.post(trackingUrl, trackedEvents); } }; }]; } describe('eventTracker', function() { var postSpy; beforeEach(module(function($provide) { // Register the eventTracker provider $provide.provider('eventTracker', EventTrackerProvider); })); beforeEach(module(function(eventTrackerProvider) { // Configure eventTracker provider eventTrackerProvider.setTrackingUrl('/custom-track'); })); it('tracks events', inject(function(eventTracker) { expect(eventTracker.event('login')).toEqual(1); expect(eventTracker.event('login')).toEqual(2); })); it('saves to the tracking url', inject(function(eventTracker, $http) { postSpy = spyOn($http, 'post'); eventTracker.event('login'); eventTracker.save(); expect(postSpy).toHaveBeenCalled(); expect(postSpy.mostRecentCall.args[0]).not.toEqual('/track'); expect(postSpy.mostRecentCall.args[0]).toEqual('/custom-track'); expect(postSpy.mostRecentCall.args[1]).toEqual({ 'login': 1 }); })); }); -
-
factory(name, $getFn);
Зарегистрировать фабрику службы, которая будет вызвана для возвращения экземпляра службы. Это сокращение для регистрации службы, где её провайдер состоит только из свойства
$get, являющегося предоставленной функцией фабрики службы. Если вам не нужно настраивать свою службу в провайдере, используйте $provide.factory(getFn).Параметры
Парам Тип Подробности name stringИмя экземпляра.
$getFn function()Array.<(string|function())>Инжектируемая $getFn для создания экземпляра. Внутренне это сокращение для
$provide.provider(name, {$get: $getFn}).Возвращаемое значение
Objectзарегистрированный экземпляр провайдера
Примеры
Вот пример регистрации службы
$provide.factory('ping', ['$http', function($http) { return function ping() { return $http.send('/ping'); }; }]);Вы затем можете ввести и использовать эту службу следующим образом:
someModule.controller('Ctrl', ['ping', function(ping) { ping(); }]); -
service(name, constructor);
Зарегистрировать конструктор службы, который будет вызван с
newдля создания экземпляра службы. Это сокращение для регистрации службы, где свойство$getпровайдера — это функция-фабрика, которая возвращает экземпляр, созданный инжектором из функции-конструктора службы.Внутренне это выглядит примерно так:
{ $get: function() { return $injector.instantiate(constructor); } }Если вы определяете свою службу как тип/класс, используйте $provide.service(class).
Параметры
Парам Тип Подробности name stringИмя экземпляра.
constructor function()Array.<(string|function())>Инжектируемый класс (функция-конструктор), который будет создан.
Возвращаемое значение
Objectзарегистрированный экземпляр провайдера
Примеры
Вот пример регистрации службы с помощью $provide.service(class).
var Ping = function($http) { this.$http = $http; }; Ping.$inject = ['$http']; Ping.prototype.send = function() { return this.$http.get('/ping'); }; $provide.service('ping', Ping);Вы затем можете ввести и использовать эту службу следующим образом:
someModule.controller('Ctrl', ['ping', function(ping) { ping.send(); }]); -
value(name, value);
Зарегистрировать службу-значение в $injector, например, строку, число, массив, объект или функцию. Это сокращение для регистрации службы, где свойство
$getпровайдера — это функция-фабрика, которая не принимает аргументов и возвращает службу-значение. Это также означает, что невозможно инжектировать другие службы в службу-значение.Службы-значения похожи на константные службы, за исключением того, что их нельзя вводить в функцию конфигурации модуля (см.
angular.Module), но их можно перезаписать с помощью декоратора Angular.Параметры
Парам Тип Подробности name stringИмя экземпляра.
value *Значение.
Возвращаемое значение
Objectзарегистрированный экземпляр провайдера
Примеры
Вот несколько примеров создания служб-значений.
$provide.value('ADMIN_USER', 'admin'); $provide.value('RoleLookup', { admin: 0, writer: 1, reader: 2 }); $provide.value('halfOf', function(value) { return value / 2; }); -
constant(name, value);
Зарегистрировать константную службу в $injector, например, строку, число, массив, объект или функцию. Как и в случае со службой value, нельзя инжектировать другие службы в константу.
Но в отличие от value, константу можно инжектировать в функцию конфигурации модуля (см.
angular.Module), и её нельзя перезаписать с помощью декоратора Angular.Параметры
Парам Тип Подробности name stringИмя константы.
value *Значение константы.
Возвращаемое значение
Objectзарегистрированный экземпляр
Примеры
Вот несколько примеров создания констант:
$provide.constant('SHARD_HEIGHT', 306); $provide.constant('MY_COLOURS', ['red', 'blue', 'grey']); $provide.constant('double', function(value) { return value * 2; }); -
decorator(name, decorator);
Зарегистрировать функцию-декоратор в $injector. Функция-декоратор перехватывает создание службы, позволяя переопределять или изменять поведение службы. Возвращаемое значение функции-декоратора может быть исходной службой или новой службой, которая заменяет (или оборачивает и делегирует) исходную службу.
Дополнительную информацию об использовании декораторов можно найти в руководстве по декораторам.
Параметры
Парам Тип Подробности name stringИмя службы, которую необходимо декорировать.
decorator function()Array.<(string|function())>Эта функция будет вызвана при необходимости предоставления службы и должна вернуть декорированный экземпляр службы. Функция вызывается с помощью метода injector.invoke и поэтому полностью инжектируема. Локальные аргументы инжекции:
-
$delegate— исходный экземпляр службы, который можно заменить, модифицировать, настроить, декорировать или делегировать ему.
Примеры
Вот как мы декорируем службу $log для преобразования предупреждений в ошибки путём перехвата вызовов $log.warn().
$provide.decorator('$log', ['$delegate', function($delegate) { $delegate.warn = $delegate.error; return $delegate; }]); -
© 2010–2017 Google, Inc.
Licensed under the Creative Commons Attribution License 4.0.
https://code.angularjs.org/1.5.11/docs/api/auto/service/$provide