Улучшить эту документацию Просмотреть исходный код $injector
- сервис в модуле 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Имя сервиса для запроса.
Возвращаемое значение
booleantrueесли инжектор имеет данный сервис. -
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–2018 Google, Inc.
Licensed under the Creative Commons Attribution License 4.0.
https://code.angularjs.org/1.6.9/docs/api/auto/service/$injector