Angularjs &引用;未捕获错误:[$injector:unpr]";展开后带有角度传感器

Angularjs &引用;未捕获错误:[$injector:unpr]";展开后带有角度传感器,angularjs,Angularjs,我有一个相当简单的Angular应用程序,它在我的开发人员机器上运行得很好,但在我部署它之后出现了以下错误消息(在浏览器控制台中): 未捕获错误:[$injector:unpr]http://errors.angularjs.org/undefined/$injector/unpr?p0=t提供程序%20%3C-%20t%20%3C-%20%24http%20%3C-%20%24compile 除此之外,没有其他信息。它发生在页面首次加载时 我正在运行ASP.NETMVC5、Angular 1.

我有一个相当简单的Angular应用程序,它在我的开发人员机器上运行得很好,但在我部署它之后出现了以下错误消息(在浏览器控制台中):

未捕获错误:[$injector:unpr]http://errors.angularjs.org/undefined/$injector/unpr?p0=t提供程序%20%3C-%20t%20%3C-%20%24http%20%3C-%20%24compile

除此之外,没有其他信息。它发生在页面首次加载时

我正在运行ASP.NETMVC5、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时,我可以复制它。

如果您遵循链接,它会告诉您错误是由于$injector无法解析您的依赖关系造成的。这是angular的一个常见问题,当javascript变得小型化/丑陋化/无论您在生产中对它做什么

问题是当您有控制器时

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
}])
function MyController($scope, $http) {
    // ...
}
这会解决你的问题


再次重申一下,我所说的一切都在错误消息提供给您的链接上。

我自己也遇到了同样的问题,但我的控制器定义看起来与上面的略有不同。对于定义如下的控制器:

angular.module("MyApp")
  .controller("MyCtrl", ["$scope", "$q", function($scope, $q) {
  // your code
}])
function MyController($scope, $http) {
    // ...
}
只需在声明后添加一行,指示在实例化控制器时要注入哪些对象:

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

这使缩小变得安全。

如果您为angular app\resources\Directions和其他内容分离了文件,那么您可以像这样禁用angular app捆绑包的缩小功能(在捆绑包配置文件中使用new bundle()而不是ScriptBundle():


并且angular应用程序将在未修改的捆绑包中出现。

如果控制器或指令未指定为依赖项和函数数组,则会出现此问题。比如说

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) { //<-- difference
            $scope.selectThisOption = function () {
                // some code
            };
        }]
    };
});
angular.module(“appName”).directive('directiveName',function(){
返回{
限制:“AE”,
templateUrl:'calender.html'

控制器:['$scope',function($scope){/在控制器功能中添加$http,$scope服务,有时如果它们缺少这些错误就会发生。

如果您为angular app\resources\Directions和其他内容分离了文件,那么您可以像这样禁用angular app捆绑包的缩小(使用新捆绑包()与捆绑包配置文件中的ScriptBundle()不同:

我遇到了相同的问题,但问题不同,我试图创建一个服务并将$scope作为参数传递给它。
这是获取此错误的另一种方法,该链接的文档中说:


尝试将范围对象注入任何不是控制器或指令的对象,例如服务,也会抛出未知的提供程序:$scopeProvider感谢您建议实际访问链接-我假设它是一些内部工件,而不是为了我的利益。事实证明,我通过
$inject
公共变量,我相信它与您建议的方式相同(请参阅)。我将更新我的问题。也就是说,它显然与缩小过程有关,就像我在我的开发机器上强制ASP.NET MVC缩小一样(
BundleTable.EnableOptimizations=true;
),我可以重现这个问题。继续查找。好的,找到了答案。我在做DI时忘记了另一个地方,它在缩小过程中被搞得一团糟。谢谢,这是正确的答案。还有一个程序包将自动为您处理此问题,并为Rails调用了相应的gem。@RyanTuck-换句话说,对于未精简的代码,Angular可以只查看函数中的变量名,并对需要注入的内容进行猜测。但是对于精简的代码,变量名都被屏蔽了,因此它需要一些其他机制-一种在代码精简时不会改变的机制-来知道注入什么。Tha$inject数组和其他机制就是在这里发挥作用的。关于性能,哪一个更好?Bundle()或ScriptBundle()?@Thomas.Benz使用Bundle()只会禁用脚本的缩小。这里的问题是当ScriptBundle()时缩小一些Angular脚本,它会缩短函数名并执行其他相关操作。当Angular尝试执行一些内部依赖注入或类似操作时,它找不到合适的函数,因为它们的名称以自定义方式更改(例如从“超级控制器”更改为“s”或其他)。因此,最好不修改angular脚本,或者尝试使用其他库进行缩小,而不是使用默认库。