Ошибка после минификации углового 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';
}]);

ошибка больше не появляется

Другие вопросы по тегам