Ошибка 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()
}
});
}