Подтвердить что ты не робот

Поиск причины ошибок "Неизвестный поставщик"

Я получаю следующую ошибку:

Error: [$injector:unpr] Unknown provider: nProvider <- n

Я знаю, что это вызвано процессом минимизации, и я понимаю, почему. Однако есть ли простой способ определить, какой файл действительно вызывает проблему?

4b9b3361

Ответ 1

Angular 1.3.x имеет директиву ng-strict-di, которая помещается в тот же элемент, что и директива ng-app. Этот элемент заставляет ваше приложение вызывать ошибку, если зависимости не были аннотированы. Хотя он по-прежнему не дает вам номер строки оскорбительного кода, он дает вам функцию с ее параметрами (например, function ($ scope, myServiceName)), которая, как мы надеемся, достаточно уникальна, что вы можете быстро найти ее в хорошем редактирование кода.

Хороший обзор директивы: ng-strict-di.

Ответ 2

Я понимаю вопрос, и у меня есть ответ, он слегка запутан.

То, как я нашел проблему, состояло в том, чтобы переименовать все идентификаторы, чтобы сделать их ВСЕ уникальными, тогда вы получите что-то полезное для поиска в своем скомпилированном javascript, который, надеюсь, укажет вам на виновника.

загрузите мою измененную версию uglify (ожидание запроса на перенос...)

brew install node, если у вас не установлен node.

./bin/uglifyjs --unique_ids original.min.js >new.min.js

Теперь замените скомпилированные js на new.min.js и загрузите приложение, чтобы воспроизвести проблему теперь вы должны получить ошибку инъекции зависимостей, например n4536

Если ваш редактор потрясающий с супер длинными строками, вы можете просто загрузить new.min.js, искать n4536 и, надеюсь, это поможет вам определить виновника.

Если это не будет сделано для печати некоторого контекста вокруг проблемы. egrep -o '.{199}n4536.{99}' new.min.js

Ответ 3

Angular У инжектора есть 3 способа разрешения зависимостей для вас:

1. Вывод зависимостей от имен аргументов функций. Это наиболее часто используется во всех примерах angular, например.

app.controller('MyController', function($scope, MyService) { ... });

В этом случае инжектор выполняет функцию как строку, анализирует имена аргументов и ищет службы/фабрики/все что-либо, соответствующие этому имени.

2. Встроенные аннотации. Вы также можете столкнуться с этим синтаксисом:

app.controller('MyController', ['$scope', 'MyService', function($scope, MyService) { ... }]);

В этом случае вы значительно упростите форсунку, поскольку вы явно указываете имена требуемых зависимостей. Имена заключены в кавычки, а js minifiers не изменяют строки в коде.

3. Встроенные аннотации как свойство. Если вы определяете свои контроллеры как функции, вы можете задать аннотации в специальном свойстве $inject:

function MyController($scope, MyService) {...}
MyController.$inject = ['$scope', 'MyService'];

В этом случае мы также явно указываем зависимости.

Я предполагаю, что вы используете решение no. 1. Как только minifier изменяет имена ваших неявно определенных зависимостей, инжектор больше не знает, каковы ваши зависимые функции. Чтобы преодолеть это, вы должны использовать второй или третий способ аннотирования зависимостей.

Ответ 4

Несмотря на то, что не существует отличного способа отладить эти проблемы с DI, если вы не знаете, где искать, у меня было ощущение, что мое было в менее очевидном месте... и это было:

App.Services = angular.module('spokenvote.services', ['ngResource', 'ngCookies'])
    .config(servicesConfig)
    .run(($rootScope, $location) -> $rootScope.location = $location)

должно быть:

App.Services = angular.module('spokenvote.services', ['ngResource', 'ngCookies'])
    .config(servicesConfig)
    .run(['$rootScope', '$location', ($rootScope, $location) -> $rootScope.location = $location])