我有一个相当简单的Angular应用程序,它在我的开发机器上运行得很好,但是在我部署它之后失败了这个错误消息(在浏览器控制台中):
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,并通过git推送到Azure。
谷歌搜索没有出现任何有趣的东西。
有什么建议吗?
编辑:
我正在使用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
时,我可以重现它。
答案 0 :(得分:159)
如果您按照链接进行操作,它会告诉您错误的结果是$ injector无法解析您的依赖项。这是一个常见的问题,当javascript被缩小/丑化/无论你为生产做什么。
问题是当你有例如控制器;
angular.module("MyApp").controller("MyCtrl", function($scope, $q) {
// your code
})
缩小将$scope
和$q
更改为随机变量,这些变量不会告知角度要注入的内容。解决方案是声明您的依赖关系:
angular.module("MyApp")
.controller("MyCtrl", ["$scope", "$q", function($scope, $q) {
// your code
}])
那应该解决你的问题。
只是为了重新迭代,我所说的一切都在错误信息提供给你的链接上。
答案 1 :(得分:13)
我自己也遇到了同样的问题,但我的控制器定义看起来与上面的有点不同。对于像这样定义的控制器:
function MyController($scope, $http) {
// ...
}
只需在声明后添加一行,指示在实例化控制器时要注入的对象:
function MyController($scope, $http) {
// ...
}
MyController.$inject = ['$scope', '$http'];
这使它更加安全。
答案 2 :(得分:11)
当控制器或指令未指定为依赖项和函数数组时,会发生此问题。例如
angular.module("appName").directive('directiveName', function () {
return {
restrict: 'AE',
templateUrl: 'calender.html',
controller: function ($scope) {
$scope.selectThisOption = function () {
// some code
};
}
};
});
缩小时范围' $范围'传递给控制器的函数被替换为单个字母的变量名。这将使角度无关紧要。为了避免这种情况,请将依赖项名称和函数作为数组传递。
angular.module("appName").directive('directiveName', function () {
return {
restrict: 'AE',
templateUrl: 'calender.html'
controller: ['$scope', function ($scope) {
$scope.selectThisOption = function () {
// some code
};
}]
};
});
答案 3 :(得分:10)
如果你有角度app \ resources \ directives和其他东西的单独文件,那么你可以像这样禁用你的角度应用程序包的缩小(在你的bundle配置文件中使用新的Bundle()而不是ScriptBundle()): / p>
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"));
并且角度应用程序将出现在未修改的包中。
答案 4 :(得分:0)
在控制器功能中添加$ http,$ scope服务,有时如果它们丢失则会发生这些错误。
答案 5 :(得分:0)
如果你有角度app \ resources \ directives和其他东西的单独文件,那么你可以像这样禁用你的角度应用程序包的缩小(在你的bundle配置文件中使用新的Bundle()而不是ScriptBundle()): / p>
答案 6 :(得分:0)
我遇到了同样的问题,但问题是另一个问题,我试图创建一个服务并将$ scope作为参数传递给它。
这是另一种获取此错误的方法,因为该链接的文档说:
尝试将范围对象注入任何非控制器或指令的对象(例如服务)也会抛出未知提供者:$ scopeProvider< - $ scope error。如果错误地将控制器注册为服务,可能会发生这种情况,例如:
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.
}]);