Улучшить эту документацию Просмотреть исходный код $provide
- сервис в модуле auto
Обзор
Сервис $provide предоставляет множество методов для регистрации компонентов в $injector. Многие из этих функций также доступны в angular.Module.
В AngularJS сервис — это объект-синглтон, созданный фабрикой сервиса. Эти фабрики сервисов — функции, которые, в свою очередь, создаются провайдером сервиса. Провайдеры сервиса — это конструкторские функции. При создании они должны содержать свойство, называемое $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), но их можно переопределить с помощью декоратора AngularJS decorator.Параметры
Параметр Тип Подробности 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), и ее нельзя переопределить с помощью декоратора AngularJS decorator.Параметры
Параметр Тип Подробности 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–2020 Google, Inc.
Licensed under the Creative Commons Attribution License 3.0.
https://code.angularjs.org/1.8.2/docs/api/auto/service/$provide