"Непринятая ошибка: [$ injector: unpr]" с angular после развертывания

У меня есть довольно простое приложение Angular, которое отлично работает на моей машине dev, но не удается с этим сообщением об ошибке (в консоли браузера) после его развертывания:

Uncaught Error: [$injector:unpr] http://errors.angularjs.org/undefined/$injector/unpr?p0=tProvider%20%3C-%20t%20%3C-%20%24http%20%3C-%20%24compile

Никакого другого сообщения кроме этого. Это происходит, когда страница сначала загружается.

Я запускаю ASP.NET MVC5, Angular 1.2RC3 и нажимаю на Azure через git.

Гуглинг не нашел ничего интересного.

Любые предложения?

EDIT:

Я использую TypeScript и определяю свои зависимости с переменной $inject, например:

export class DashboardCtrl {

    public static $inject = [
        '$scope',
        '$location',
        'dashboardStorage'
    ];

    constructor(
        private $scope: IDashboardScope,
        private $location: ng.ILocationService,
        private storage: IDashboardStorage) {
    }
}

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

Тем не менее, это явно имеет отношение к процессу минимизации, так как когда я устанавливал BundleTable.EnableOptimizations = true на свою машину dev, я могу воспроизвести его.

Ответ 1

Если вы следуете своей ссылке, она сообщает вам, что ошибка возникает из-за того, что инжектор $не может разрешить ваши зависимости. Это обычная проблема с angular, когда javascript получает minified/ouglified/все, что вы делаете с ним для производства.

Проблема заключается в том, когда у вас есть, например, контроллер;

angular.module("MyApp").controller("MyCtrl", function($scope, $q) {
  // your code
})

Минализация изменяет $scope и $q на случайные величины, которые не указывают angular, что нужно вводить. Решение состоит в том, чтобы объявить ваши зависимости следующим образом:

angular.module("MyApp")
  .controller("MyCtrl", ["$scope", "$q", function($scope, $q) {
  // your code
}])

Это должно решить вашу проблему.

Просто для повторной итерации, все, что я сказал, находится по ссылке, предоставленной вам сообщением об ошибке.

Ответ 2

Иди в эту же проблему самостоятельно, но мои определения контроллеров выглядели немного иначе, чем выше. Для контроллеров, определенных следующим образом:

function MyController($scope, $http) {
    // ...
}

Просто добавьте строку после объявления, указывающего, какие объекты следует вводить при создании экземпляра контроллера:

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

Это делает его мини-безопасным.

Ответ 3

Эта проблема возникает, когда контроллер или директива не указаны как массив зависимостей и функций. Например

angular.module("appName").directive('directiveName', function () {
    return {
        restrict: 'AE',
        templateUrl: 'calender.html',
        controller: function ($scope) {
            $scope.selectThisOption = function () {
                // some code
            };
        }
    };
});

При минимизации "$ scope", переданная функции контроллера, заменяется именем переменной с одной буквой. Это сделает angular неопределенным зависимость. Чтобы избежать этого, пропустите имя зависимостей вместе с функцией как массив.

angular.module("appName").directive('directiveName', function () {
    return {
        restrict: 'AE',
        templateUrl: 'calender.html'
        controller: ['$scope', function ($scope) {
            $scope.selectThisOption = function () {
                // some code
            };
        }]
    };
});

Ответ 4

Если вы разделили файлы для angular приложений\ресурсов\директив и других материалов, вы можете просто отключить минимизацию вашего пакета приложений angular, как это (используйте вместо этого новый Bundle() вместо ScriptBundle() в конфигурации вашего пакета файл):

bundles.Add(
new Bundle("~/bundles/angular/SomeBundleName").Include(
               "~/Content/js/angular/Pages/Web/MainPage/angularApi.js",
               "~/Content/js/angular/Pages/Web/MainPage/angularApp.js",
               "~/Content/js/angular/Pages/Web/MainPage/angularCtrl.js"));

И приложение angular появится в списке немодифицированных.

Ответ 5

Добавить функции $http, $scope в контроллере fucntion, иногда, если они отсутствуют, эти ошибки происходят.

Ответ 6

Если вы разделили файлы для angular приложений\ресурсов\директив и других материалов, вы можете просто отключить минимизацию вашего пакета приложений angular, как это (используйте вместо этого новый Bundle() вместо ScriptBundle() в конфигурации вашего пакета файл):

Ответ 7

У меня была такая же проблема, но проблема была другая, я пытался создать службу и передать ей $ scope в качестве параметра.
Это еще один способ получить эту ошибку, поскольку документация по этой ссылке говорит:

Попытка ввести объект области видимости во все, что не является контроллером или директивой, например службой, также приведет к ошибке Неизвестный поставщик: $ scopeProvider <- $. Это может произойти, если кто-то ошибочно зарегистрирует контроллер как услугу, например:

angular.module('myModule', [])
       .service('MyController', ['$scope', function($scope) {
        // This controller throws an unknown provider error because
        // a scope object cannot be injected into a service.
}]);