Spec-Zone.ru › Angular.js 1.8

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

  1. Сервис в модуле auto

Обзор

$injector используется для получения экземпляров объектов, определенных провайдером, создания экземпляров типов, вызова методов и загрузки модулей.

Следующее всегда верно:

var $injector = angular.injector();
expect($injector.get('$injector')).toBe($injector);
expect($injector.invoke(function($injector) {
  return $injector;
})).toBe($injector);

Аннотация функции инъекции

JavaScript не имеет аннотаций, а для инъекции зависимостей они необходимы. Следующие способы аннотации функций с аргументами инъекции допустимы и эквивалентны.

// inferred (only works if code not minified/obfuscated)
$injector.invoke(function(serviceA){});

// annotated
function explicit(serviceA) {};
explicit.$inject = ['serviceA'];
$injector.invoke(explicit);

// inline
$injector.invoke(['serviceA', function(serviceA){}]);

Вывод

В JavaScript вызов toString() для функции возвращает определение функции. Затем определение можно обработать, и аргументы функции можно извлечь. Этот метод обнаружения аннотаций запрещен, когда инжектор находится в строгом режиме. ПРИМЕЧАНИЕ: Это не работает с минимизацией и инструментами обфускации, так как эти инструменты изменяют имена аргументов.

$inject Аннотация

Добавив свойство $inject к функции, можно указать параметры инъекции.

Встроенный

В виде массива имен инъекций, где последним элементом массива является вызываемая функция.

Методы

  • get(name, [caller]);

    Возвращает экземпляр сервиса.

    Параметры

    Параметр Тип Подробности
    name string

    Имя экземпляра для извлечения.

    caller
    (необязательно)
    string

    Необязательная строка, указывающая источник вызова функции для сообщений об ошибках.

    Возвращаемое значение

    *

    Экземпляр.

  • invoke(fn, [self], [locals]);

    Вызывает метод и предоставляет аргументы метода из $injector.

    Параметры

    Параметр Тип Подробности
    fn function()Array.<(string|function())>

    Инъекционная функция для вызова. Параметры функции инжектируются в соответствии с правилами аннотации $inject Аннотация.

    self
    (необязательно)
    Object

    Ссылка на this для вызываемого метода.

    locals
    (необязательно)
    Object

    Необязательный объект. Если задан, любые имена аргументов сначала считываются из этого объекта, прежде чем обращаться к $injector.

    Возвращаемое значение

    *

    значение, возвращенное вызываемой fn функцией.

  • has(name);

    Позволяет пользователю запросить, существует ли определенный сервис.

    Параметры

    Параметр Тип Подробности
    name string

    Имя сервиса для запроса.

    Возвращаемое значение

    boolean

    true если инжектор имеет данный сервис.

  • instantiate(Type, [locals]);

    Создает новый экземпляр типа JS. Метод принимает функцию-конструктор, вызывает оператор new и предоставляет все аргументы функции-конструктору, как указано в аннотации конструктора.

    Параметры

    Параметр Тип Подробности
    Type Function

    Аннотированная функция-конструктор.

    locals
    (необязательно)
    Object

    Необязательный объект. Если задан, любые имена аргументов сначала считываются из этого объекта, прежде чем обращаться к $injector.

    Возвращаемое значение

    Object

    новый экземпляр Type.

  • annotate(fn, [strictDi]);

    Возвращает массив имён сервисов, которые запрашивает функция для инъекции. Этот API используется инжектором для определения сервисов, которые необходимо инжектировать в функцию при её вызове. Существует три способа аннотации функции необходимыми зависимостями.

    Имена аргументов

    Простейший способ — извлечь зависимости из аргументов функции. Это делается путём преобразования функции в строку с использованием метода toString() и извлечения имён аргументов.

    // Given
    function MyController($scope, $route) {
      // ...
    }
    
    // Then
    expect(injector.annotate(MyController)).toEqual(['$scope', '$route']);
    

    Этот метод можно запретить, используя строгий режим инъекции.

    Этот метод не работает с минимизацией/обфускацией кода. По этой причине поддерживаются следующие стратегии аннотации.

    Свойство $inject

    Если у функции есть свойство $inject и его значение — массив строк, то строки представляют имена сервисов, которые необходимо инжектировать в функцию.

    // Given
    var MyController = function(obfuscatedScope, obfuscatedRoute) {
      // ...
    }
    // Define function dependencies
    MyController['$inject'] = ['$scope', '$route'];
    
    // Then
    expect(injector.annotate(MyController)).toEqual(['$scope', '$route']);
    

    Оператор массива

    Часто бывает желательно встраивать инъекционные функции, и в этом случае установка свойства $inject очень неудобна. В таких ситуациях использование оператора массива для указания зависимостей, который выдерживает минимизацию, является лучшим выбором:

    // We wish to write this (not minification / obfuscation safe)
    injector.invoke(function($compile, $rootScope) {
      // ...
    });
    
    // We are forced to write break inlining
    var tmpFn = function(obfuscatedCompile, obfuscatedRootScope) {
      // ...
    };
    tmpFn.$inject = ['$compile', '$rootScope'];
    injector.invoke(tmpFn);
    
    // To better support inline function the inline annotation is supported
    injector.invoke(['$compile', '$rootScope', function(obfCompile, obfRootScope) {
      // ...
    }]);
    
    // Therefore
    expect(injector.annotate(
       ['$compile', '$rootScope', function(obfus_$compile, obfus_$rootScope) {}])
     ).toEqual(['$compile', '$rootScope']);
    

    Параметры

    Параметр Тип Подробности
    fn function()Array.<(string|function())>

    Функция, для которой необходимо получить имена зависимых сервисов, как описано выше.

    strictDi
    (необязательно)
    boolean

    Запретить вывод аннотаций по именам аргументов.

    (по умолчанию: false)

    Возвращаемое значение

    Array.<string>

    Имена сервисов, которые требуются функции.

  • loadNewModules([mods]);

    Это опасный API, который вы используете на свой страх и риск!

    Добавляет указанные модули в текущий инжектор.

    Этот метод добавит каждый из инжектируемых элементов в инжектор и выполнит все блоки config и run для каждого модуля, переданного методу.

    Если модуль уже загружен в инжектор, он не будет загружен снова.

    • Разработчик приложения отвечает за загрузку кода, содержащего модули, и за обеспечение того, что ленивые скрипты не загружаются и не выполняются чаще, чем необходимо.
    • Ранее скомпилированный HTML не будет затронут новыми директивами, фильтрами и компонентами.
    • Модули не могут быть выгружены.

    Вы можете использовать $injector.modules для проверки того, загружен ли модуль в инжектор, что может указывать на то, что скрипт уже был выполнен.

    Параметры

    Параметр Тип Подробности
    mods
    (необязательно)
    Array<String|Function|Array>=

    массив модулей для загрузки в приложение. Каждый элемент массива должен быть именем предопределенного модуля или (аннотированной DI) функцией, которая будет вызвана инжектором как config блок. См.: модули

    Пример

    Вот пример загрузки набора модулей с помощью служебного метода под названием getScript:

    app.factory('loadModule', function($injector) {
      return function loadModule(moduleName, bundleUrl) {
        return getScript(bundleUrl).then(function() { $injector.loadNewModules([moduleName]); });
      };
    })
    

Свойства

  • modules

    Хэш, содержащий все модули, которые были загружены в $injector.

    Вы можете использовать это свойство для получения информации о модуле с помощью метода myModule.info(...).

    Например:

    var info = $injector.modules['ngAnimate'].info();
    

    Не используйте это свойство для попытки изменить модули после загрузки приложения.

© 2010–2020 Google, Inc.
Licensed under the Creative Commons Attribution License 3.0.
https://code.angularjs.org/1.8.2/docs/api/auto/service/$injector

Spec-Zone.ru

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