"Непринятая ошибка: [$ 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.
}]);