Spec-Zone.ru › Angular.js 1.6

Улучшить эту документацию Просмотреть исходный код $provide

  1. сервис в модуле 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–2018 Google, Inc.
Licensed under the Creative Commons Attribution License 4.0.
https://code.angularjs.org/1.6.9/docs/api/auto/service/$provide

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API