Ошибка AngularJS: Неизвестный поставщик: aProvider <- a

ОК. Я официально лысый сейчас, после того, как я стригу свои волосы с этой печально известной проблемой: Minfied приложение AngularJS просто не работает, с этой ошибкой:

Ошибка: [$ injector: unpr] Неизвестный поставщик: aProvider < - a http://errors.angularjs.org/1.2.6/ $injector/unpr? p0 = aProvider %20% 3C- %20a     на http://localhost/my-app/dist/scripts/1bde0e2e.vendor.js:4:11492    на http://localhost/my-app/dist/scripts/1bde0e2e.vendor.js:4:26946    в Object.c [as get] (http://localhost/my-app/dist/scripts/1bde0e2e.vendor.js:4:26250)     на http://localhost/my-app/dist/scripts/1bde0e2e.vendor.js:4:27041    при c (http://localhost/my-app/dist/scripts/1bde0e2e.vendor.js:4:26250)     в Object.d [as invoke] (http://localhost/my-app/dist/scripts/1bde0e2e.vendor.js:4:26496)     на http://localhost/my-app/dist/scripts/1bde0e2e.vendor.js:9:910    в Object.f [as forEach] (http://localhost/my-app/dist/scripts/1bde0e2e.vendor.js:4:11927)     на http://localhost/my-app/dist/scripts/1bde0e2e.vendor.js:9:856    в j (http://localhost/my-app/dist/scripts/1bde0e2e.vendor.js:5:27235)

У многих других людей была и эта проблема, но похоже, что она может быть исправлена ​​путем объявления зависимостей как массива, а не голых параметров функции, например:

angular.module('my-app').controller('LoginCtrl', [ '$scope', 'HttpService', function($scope, HttpService) { ... }]);

вместо этого:

angular.module('my-app').controller('LoginCtrl', function($scope, HttpService) { ... });

Но это не работает в моем случае. Я проверил все свои сценарии (кофе и сгенерированные javascripts), все они используют правильное объявление стиля массива.

Проблема не связана с дополнительными пакетами. Я попытался переместить все дополнительные ссылки на пакеты из блока <!-- bower:js --> (чтобы они не были минимизированы grunt), но проблема все еще остается. Это значит, что мой код виноват... Но опять же, я пробовал (кажется,), что только исправление доступно, безрезультатно.

Любой намек, даже на то, как правильно отладить это?

Спасибо заранее!

Ответы

Ответ 1

Наконец, я нашел проблему. И да, это ошибка, которую я пропустил.

Для всех, кто может страдать от одной и той же головной боли: объявление формата массива должно выполняться в параметрах $routeProvider resolve. В моем случае (CoffeeScript впереди):

app.config (['$routeProvider', ($routeProvider) ->
  $routeProvider
    .when '/',
      templateUrl: 'views/main.html'
      controller: 'MainCtrl'
      resolve: 
        groups: ['GroupService', (GroupService) ->  # I MISSED THIS
          return GroupService.getAll()
        ]
        entries: ['EntryService', (EntryService) ->  # AND THIS
          return EntryService.getAll()
        ]
    # ...
])

Надеюсь, это поможет!

Ответ 2

Такое поведение может возникнуть, если вы используете неявную инъекцию вместо явного объявления ваших зависимостей. По моему опыту я столкнулся с такой проблемой с особыми типами сервисов Angular.js, которые возвращают экземпляр класса (например, для создания абстрактных контроллеров классов или некоторых других частных случаев).

Например: AbstractBaseControllerClass

Во время оценки у меня была та же проблема. Я решил использовать внутреннее объявление инъекции зависимостей. Надеюсь, что это поможет

Ответ 3

Для тех, кому не нравится CoffeeScript.

Я просто взял некоторый код и поместил его.

 $stateProvider

    .state('screen', {
        url: '/user/',
        templateUrl: 'user.html',
        controller: 'UserController',
        controllerAs: 'user',
        location: "User",
        resolve: ['$q', 'UserService', '$state', '$timeout', authenticateUser
        ]
    })

function authenticateUser($q, UserService, $state, $timeout) {

    UserService.getLoginStatus().then(function () {
        if (UserService.user) {
            console.log("is user");
            return $q.when();
        } else {
            console.log("not user");

            $timeout(function () {
                // This code runs after the authentication promise has been rejected.
                // Go to the log-in page
                $state.go('login')
            });
            return $q.reject()

        }
    });

}