debugging未知提供者在缩小angular度的JavaScript

我很难确定哪些是我的angular度应用程序中会导致错误的方法中的哪一个:

Uncaught Error: [$injector:unpr] Unknown provider: nProvider <- n

这只发生在javascript被ASP.Net捆绑和缩小之后。

我已经确保所有的控制器和任何其他DI正在使用小型安全的方法,IE我的控制器/服务等正在使用的方法:

 appControllers.controller('myCtrl', ['$scope', function($scope){ //...... }]); 

我已经经历了我们的应用程序中的每个JS文件 – 有很多…并找不到违反这种注入依赖关系的任何东西 – 尽pipe必须有某个地方…

有没有更好的方法来查明哪种方法可能导致此错误?

谢谢

对于任何与这个问题斗争的人,我find了一个更简单的解决scheme。 如果您打开开发人员控制台(在Chrome上),并在angular度引发错误时添加一个断点:

角度抛出一个错误

然后,在右边的堆栈轨迹上,点击你看到的第一个“invoke”。 这将带你到invoke函数,其中第一个参数是angular正试图注入的函数:

我能够检查功能

然后我通过我的代码search了一个看起来像这样的函数(在本例中为grep "\.onload" -R public ),并find了8个需要检查的地方。

我希望这有帮助!

对于任何人阅读这个,使用Angular 1.3

你现在可以像这样使用Angular的ng-strict-di检查:

 <div ng-app="some-angular-app" ng-strict-di> ... </div> 

如果您没有使用数组语法加载您的依赖关系,这将给您一个适当的错误信息。

我有同样的问题,我find了一个解决scheme,可以帮助其余的。 我的build议基本上是我在评论和文档中看到的。 如果您使用的是Angular 1.3.0或更高版本,您可以使用这个:

 <html ng-app="myApp" ng-strict-di> <body> I can add: {{ 1 + 2 }}. <script src="angular.js"></script> </body> </html> 

就我而言,我拥有一个文件app.js中的所有东西,所以我唯一需要做的就是在结尾添加这个小代码:

 angular.bootstrap(document, ['myApp'], { strictDi: true }); 

在Angular Docs中有更好的logging

我希望有帮助。 祝你好运!

正如在评论中提到的,这些是我尝试find我的JS错误的步骤。

如果还有其他更简单的解决scheme,请随时发布,我可以将其标记为已接受。


试图debugging缩小的代码是一场噩梦。

我最终做的是直接从Chrome中的检查员复制我缩小的JavaScript。

然后我把JS粘贴到http://www.jspretty.com/ – 我曾尝试http://jsbeautifier.org/,但发现他们的网站冻结了这么大的JS代码。;

一旦“相当”,我在我的解决scheme中创build了一个test.js文件,并将其更容易阅读,并将代码粘贴到其中。

快速注释出我的_layout@script标签,并添加一个链接到test.js文件,我准备debugging一个现在,更容易阅读,大块的Javascript。

遍历调用堆栈仍然非常尴尬,但现在你可以看到实际的方法,这使得它不太可能。

帮助我解决这个问题的东西(终于!)实际上已经在angular度文档中了! 如果在定义ng-app地方将ng-strict-di属性添加到代码中,angular会引发严格的警告,以便您可以更轻松地看到开发模式中发生了什么。 我希望这是默认的!

请参阅ngApp文档底部的参数列表。

https://docs.angularjs.org/api/ng/directive/ngApp

这对我的作品的方式如下:

1)有两个testing规范html文件(单元测​​试)最小化和明确

2)确保文件的捆绑与普通规格文件(JS脚本参考)的顺序相同

3)确保显式声明所有的依赖关系(数组或$注入声明见http://www.ozkary.com/2015/11/angularjs-minimized-file-unknown-provider.html

当unit testing(miminized reference)文件出现错误时,我可以比较并确保文件的引用顺序与工作文件一致。

希望有所帮助。

我有类似的问题,并用了大量的时间进行调查,并发现它是Chrome扩展Batarang注入错误的代码和错误在Angular看起来完全一样。 真的很可惜,很难find究竟是什么原因造成的问题。

我也有类似的问题。 解决办法是从ozkary的第3点开始,也就是确保显式声明所有依赖关系,包括“解决”你的路由的一部分。

以下是我的代码。

 when('/contact/:id', { controller: 'contactCtrl', templateUrl: 'assets/partials/contact.html', resolve: { contact: ['ContactService', '$route', function(ContactService, $route) { return ContactService.getContactDetail($route.current.params.id); }] } })