我仍然很想知道如何在我们的源代码中找到导致此问题的位置,但我已经能够手动找到问题。
在全局范围内声明了一个控制器函数,而不是.controller()
在应用程序模块上使用调用。
所以有这样的事情:
function SomeController( $scope, i18n ) { /* ... */ }
这对 AngularJS 来说效果很好,但是为了让它与 mangling 一起工作,我不得不将其更改为:
var applicationModule = angular.module( "example" );
function SomeController( $scope, i18n ) { /* ... */ }
applicationModule.controller( "SomeController", [ "$scope", "i18n", SomeController ] );
经过进一步的测试,我实际上发现了更多控制器的实例,这些控制器也引起了问题。这就是我手动找到所有这些来源的方式:
首先,我认为在 uglify 选项中启用输出美化非常重要。对于我们的繁重任务,这意味着:
options : {
beautify : true,
mangle : true
}
然后我在 Chrome 中打开了项目网站,并打开了 DevTools。这会导致记录如下错误:

我们感兴趣的调用跟踪中的方法是我用箭头标记的方法。这是providerInjector
在injector.js
. 您将要在引发异常的地方放置一个断点:

当您现在重新运行应用程序时,将触发断点,您可以向上跳转调用堆栈。将有来自invoke
ininjector.js
的调用,可从“不正确的注入令牌”字符串中识别:

该locals
参数(d
在我的代码中被修改为)很好地说明了源中的哪个对象是问题所在:

快速grep
浏览我们的源代码会发现很多 的实例modalInstance
,但是从那里开始,很容易在源代码中找到这个位置:
var ModalCreateEditMeetingController = function( $scope, $modalInstance ) {
};
必须更改为:
var ModalCreateEditMeetingController = [ "$scope", "$modalInstance", function( $scope, $modalInstance ) {
} ];
如果变量不包含有用的信息,您还可以进一步向上跳堆栈,您应该点击invoke
应该有额外提示的调用:

防止这种情况再次发生
既然您希望找到问题所在,我觉得我应该提一下如何最好地避免这种情况在未来再次发生。
显然,您可以在任何地方使用内联数组注释,或者(取决于您的偏好)$inject
属性注释,并且尽量不要在将来忘记它。如果这样做,请确保启用严格的依赖注入模式,以便及早捕获此类错误。
小心!如果您使用的是 Angular Batarang,StrictDI 可能不适合您,因为 Angular Batarang 会将未注释的代码注入您的代码(糟糕的 Batarang!)。
或者你可以让ng-annotate处理它。我强烈建议这样做,因为它消除了该领域的许多潜在错误,例如:
- DI 注释缺失
- DI 注释不完整
- DI注释顺序错误
使注释保持最新只是一件麻烦事,如果可以自动完成,您就不必这样做。ng-annotate 正是这样做的。
它应该与grunt-ng-annotate和gulp-ng-annotate很好地集成到您的构建过程中。