【问题标题】:ng-strict-di throwing error even though no DI is used即使没有使用 DI,ng-strict-di 也会抛出错误
【发布时间】:2018-08-20 15:05:43
【问题描述】:

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

【问题讨论】:

  • 你为什么要编辑我的问题?
  • (您可以在When should I edit posts?部分阅读更多关于编辑问题的内容)
  • 不回答我的问题...

标签: angularjs strict


【解决方案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

正如下面的 sn-p 所证实的那样,其他模块确实会影响 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 元素中删除,一切都会好起来的。但是,如果您这样做是为了提醒您保护依赖项的名称,请确保您的应用程序使用的所有模块在声明组件时都使用显式注释(通常库的生产构建已经被注释)。

【讨论】:

  • 好的,谢谢,我是这么认为的……奇怪的是,它是来自 Todd Motto 的样板应用程序,所以我认为它应该是开箱即用的,因为他也解释了它。它背后有一个 Gulp-Process 用于缩小/丑化,但我想为了遵循他的指示,我确实需要删除它。我只是不明白为什么...奇怪的是它对我不起作用...谢谢您的回答。
  • @Vortilion gulp 进程应该使用ngAnnotate,它基本上在构建过程中将正常注入转换为显式注解,以便您的 dist 被安全注解。
猜你喜欢
  • 1970-01-01
  • 2012-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-28
  • 1970-01-01
  • 1970-01-01
  • 2015-01-01
相关资源
最近更新 更多