Ошибка после минификации углового js. Ошибка: [$injector:unpr] Неизвестный поставщик: eProvider <- e <- makeErrorsDirective
Я использовал Gulp, чтобы минимизировать все мои файлы js. После минимизации я получил ошибку вроде следующего:
[$injector:unpr] Unknown provider: eProvider <- e <- makeErrorsDirective.
У меня была директива Custom в моем файле контроллера.
var myhubdashboardControllers = angular.module('vpdashboardmodule', []);
.directive('mhDashboard', function ($http, authService, apiService) {
return {
restrict: 'EA',
scope: {
name: '@',
dash: '@',
report: '@',
disname: '@',
disdesc: '@',
distot: '@'
},
templateUrl: 'views/dashboard/dashboard-direc.html',
link: function (scope, element, attr) {
scope.linkChk = scope.name;
switch (scope.linkChk) {
case 'Shipped This Week':
scope.url = 'erp/JobShipmentList/PostCpsVwShipmentCount';
scope.shipstatus = "Departure";
scope.period = "ThisWeek";
scope.basicfilter = "Open";
scope.linkName = "Shipments";
scope.linkDesc = "Shipped This Week";
break;
})};
Это код, используемый в моем приложении.
4 ответа
Есть причина, по которой вам нужно внедрять сервисы и контроллер в строковый массив.
если вы хотите ввести область видимости в контроллер, вы должны использовать
angular.module('yourApp')
.controller('yourController',['$scope',function($scope){
}]);
Минификация изменит имена переменных, и если вы не используете этот массив строк при внедрении сервисов или контроллеров, это будет похоже на
angular.module('yourApp')
.controller('yourController',function(e){
});
Таким образом, angular не сможет понять, что означает "e", отсюда и ошибка. Всегда помните, что порядок также важен.
.directive('mhDashboard', ['$http','authService','apiService', function ($http, authService, apiService) {
return {
restrict: 'EA',
scope: {
name: '@',
dash: '@',
report: '@',
disname: '@',
disdesc: '@',
distot: '@'
},
templateUrl: 'views/dashboard/dashboard-direc.html',
link: function (scope, element, attr) {
scope.linkChk = scope.name;
switch (scope.linkChk) {
case 'Shipped This Week':
scope.url = 'erp/JobShipmentList/PostCpsVwShipmentCount';
scope.shipstatus = "Departure";
scope.period = "ThisWeek";
scope.basicfilter = "Open";
scope.linkName = "Shipments";
scope.linkDesc = "Shipped This Week";
break;
}
}])
У меня была такая же проблема, даже когда я использую gulp-ng-annotate, но это происходит только для $stateProvider и ngDialog разрешает:
$stateProvider
.state('orders', {
url: '/orders',
templateUrl: 'templates/orders.html',
controller: 'OrdersController as vm',
resolve: {
authenticate: function (Auth) {
return Auth.getAuthResolve();
}
}
});
Решение должно быть написано так:
resolve: {
authenticate: ['Auth', function (Auth) {
return Auth.getAuthResolve();
}]
}
Поэтому он чувствует, что ng-annotate не внедряет массив в resolves, а только в конструкторы контроллера / службы / фабрики.
Angular не всегда хорошо работает с минификацией.
Если вы в качестве примера напишите это:
angular.controller("MyCtrl", function ($scope) {...});
Тогда $scope
будет изменен на что-то бессмысленное во время минификации.
Если вместо этого изменить это на:
angular.controller("MyCtrl", ["$scope", function (s) {...}]);
Тогда не имеет значения, как называется первый аргумент в функции (здесь s
), пока строка "$scope"
,
Смотрите это: https://docs.angularjs.org/tutorial/step_05 в документации для получения более подробной информации.
Если вам нужна дополнительная помощь, вы должны опубликовать соответствующий код, а не только ошибку.
У меня была проблема с использованием angular-ui-router-title
, После изменения
$titleProvider.documentTitle(function($rootScope) {
return $rootScope.$title + ' my title';
});
в
$titleProvider.documentTitle(['$rootScope', function($rootScope) {
return $rootScope.$title + ' my title';
}]);
ошибка больше не появляется