ng-strict-di抛出错误,即使没有使用DI

时间:2018-08-20 15:05:44

标签: angularjs strict

我正在关注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库中,所以我不明白...

1 个答案:

答案 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元素中删除,一切都会好起来的。但是,如果您故意这样做是为了提醒您保护依赖项的名称,请确保在声明组件时,应用程序正在使用的所有模块都使用显式批注(通常已经标记了生产版本)。