Как отключить автоинжектор (магическое открытие типов инжекторов) в 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'];

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

Этот метод аннотации полезен для объявлений контроллера, поскольку он присваивает информацию аннотации функции