部署后带角度的“未捕获错误:[$ injector:unpr]”

时间:2013-10-30 01:00:06

标签: angularjs

我有一个相当简单的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时,我可以重现它。

7 个答案:

答案 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.
}]);