我仍然很想知道如何在导致此问题的源代码中找到该位置,但此后我便能够手动找到该问题。
在全局范围内声明了一个控制器函数,而不是.controller()
在应用程序模块上使用调用。
所以有这样的事情:
function SomeController( $scope, i18n ) { /* ... */ }
这对于AngularJS来说还算不错,但是为了使其能够正确处理,我不得不将其更改为:
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处理它。我强烈建议您这样做,因为这样可以消除在此方面出现很多错误的可能,例如:
保持注释的最新状态只是一个麻烦,如果可以自动完成注释,则不必这样做。ng-annotate正是这样做的。
它应该使用grunt-ng-annotate和gulp-ng-annotate很好地集成到您的构建过程中。