Как отключить автоинжектор (магическое открытие типов инжекторов) в angularjs?
У Angularjs есть эта хорошая функция автоматического обнаружения поставщиков на основе аргументов функции.
Например, если я хочу использовать $http в некоторой функции, я бы назвал ее так:
$inject.invoke(function ($http) {
});
Angularjs будет "знать", каковы мои зависимости. Это выяснит это, прочитав мое тело функции и опираясь на имена аргументов, которые он будет знать.
Однако существует проблема, когда вы хотите минимизировать код. Minifier изменит имена аргументов. Вот почему мы должны использовать это обозначение:
$inject.invoke(['$http', function ($http) {}]);
или это обозначение:
function Foo ($http) {}
Foo.$inject = ['$http'];
$inject.invoke(Foo);
Мы всегда должны в конечном итоге минимизировать наш код. Поэтому нам следует избегать использования этой магии (первый пример).
И теперь моя проблема:
Я пытаюсь минимизировать код js, и angularjs не может разрешить имя поставщика.
Я не могу найти место, где я не указал .$inject = [...]
. Теперь он просто говорит: "Unknown provider a"
и я не знаю, к какой функции он относится.
Можно ли отключить автоматическое обнаружение (автоинжектор) провайдеров? Я бы проверил и исправил свой код перед тем, как его известить.
Итак, мне интересно, как отключить этот "магический" улов.
Поскольку я всегда уменьшаю свой код, я хочу, чтобы angularjs кричали на меня, когда я случайно использую это супергероическое зло.
Как отключить его?
Ответы
Ответ 1
Начиная с версии 1.3.0-beta.6, angularjs поддерживает опцию ng-strict-di, которая может использоваться вместе с директивой ng-app для отключения автоматической инъекции.
Из Документация
если этот атрибут присутствует в элементе приложения, инжектор будет созданный в режиме "строго-ди". Это означает, что приложение не удастся для вызова функций, которые не используют явную аннотацию функции (и поэтому непригодны для минимизации), как описано в Зависимости Руководство по инъекциям и полезная информация об отладке помогут отслеживать вниз по корню этих ошибок
Ответ 2
Просто отредактируйте источник. Найдите функцию annotate и замените блок fn == 'function' следующим образом:
if (typeof fn == 'function') {
console.log("Bad magic injection in "+fn.toString().replace(STRIP_COMMENTS, ''));
}
Ответ 3
обновление:
Если кому-то это нужно из-за попытки минимизировать, возможно, это еще одно возможное решение
ngmin. Это проект AngularJS minifier.
Не уверен, что эта помощь.
По словам Игоря Минара,
Вы должны сделать что-то вроде этого
factory('Phone', function($resource){ ... }))
к
factory('Phone', ['$resource', function($resource){ ... })])
Вот официальный документ из Dev guide.
$inject Аннотации
Чтобы миниатюры могли переименовать параметры функции и способный вводить правильные услуги, функция должна быть аннотирована с помощью свойство $inject. Свойство $inject - это массив услуг имена для ввода.
var MyController = function(renamed$scope, renamedGreeter) {
...
}
MyController.$inject = ['$scope', 'greeter'];
Следует соблюдать осторожность, чтобы аннотация с введением $была синхронизирована с фактические аргументы в объявлении функции.
Этот метод аннотации полезен для объявлений контроллера, поскольку он присваивает информацию аннотации функции