我正在关注AngularJS的教程,正在使用的ng-strict-di
似乎存在问题。我确实了解它的用途,但我不明白为什么它会引发错误
未捕获的错误:[$ injector:modulerr]由于以下原因,无法实例化模块ng: 错误:[$ injector:strictdi]函数($ provide)未使用显式注释,因此无法在严格模式下调用
即使我尚未在项目中使用任何DI。另外,我在源代码中的任何地方都找不到代码function($provide)
,显然会产生此错误(缺少DI注释)。通过node_modules
包含的一个库是否有可能造成此错误?如果我删除了ng-strict-di
指令,该应用程序就会运行。
/ Edit:似乎是行
modules = modules || [];
modules.unshift(['$provide', function($provide) {
$provide.value('$rootElement', element);
}]);
负责引发此错误。但是这些都在AngularJS库中,所以我不明白...
答案 0 :(得分:1)
ng-strict-di
告诉angularjs以严格模式初始化依赖项注入器。也就是说,您必须像这样声明注入:
// using explicit annotations
.controller('GoodController1', ['$scope', function($scope) {
$scope.a = 1;
$scope.b = 2;
}])
而不是这样:
// not using annotations
.controller('BadController', function($scope) {
$scope.a = 1;
$scope.b = 2;
})
Explicit annotations用于在minify / uglify之后保护依赖项的名称,因为该过程会更改参数名称,从而阻止angularjs标识要在哪个位置注入组件。另外,启用ngStrictMode
可以帮助您确保所有依赖项都得到了显式注释(例如['$scope', function($scope){}]
),因此可以免受丑化过程的影响。
参考号:ngApp
如摘要所示,其他模块的确会影响ngStrictDi
的行为,因此,如果您在应用上使用任何第三方模块,则有可能一个(如果不是很多)模块造成这种情况。
angular.module('myApp', ['myModule'])
.controller('badController1', function() { })
angular.module('myModule', [])
.controller('badController2', function($scope) { })
<div ng-app="myApp" ng-strict-di>
<div ng-controller="badController1"></div>
<div ng-controller="badController2"></div>
</div>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.0/angular.js"></script>
最后,如果您不丑陋的代码,可以将其从ngApp
元素中删除,一切都会好起来的。但是,如果您故意这样做是为了提醒您保护依赖项的名称,请确保在声明组件时,应用程序正在使用的所有模块都使用显式批注(通常已经标记了生产版本)。