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文档底部的参数列表。
这对我的作品的方式如下:
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); }] } })