我收到以下错误:
Error: [$injector:unpr] Unknown provider: nProvider <- n
我知道这是由缩小过程引起的,我理解为什么。但是,是否有一种简单的方法可以确定哪个文件实际导致了问题?
答案 0 :(得分:27)
Angular 1.3.x有一个ng-strict-di指令,它与ng-app指令放在同一个元素上。此元素会导致应用程序在未注释依赖项时抛出错误。虽然它仍然没有给你提供违规代码的行号,但它确实为你提供了带有参数的函数(即函数($ scope,myServiceName)),这个函数非常独特,你可以很快找到它。一个很好的代码编辑。
对指令的概述:ng-strict-di。
答案 1 :(得分:7)
我理解这个问题而且我有一个答案,它只是有点令人费解。
我发现问题的方法是重命名所有标识符以使它们都是唯一的,然后你会在编译的javascript中找到有用的东西,希望能指出你的罪魁祸首。
下载我uglify的修改版本(拉请求等待...)
brew install node
如果您没有安装节点。
./bin/uglifyjs --unique_ids original.min.js >new.min.js
现在用new.min.js
替换已编译的js并加载您的应用以重现问题
现在你应该得到一个依赖注入错误,如n4536
如果你的编辑器很棒,超长线你可以加载new.min.js,寻找n4536,希望能帮助你找出罪魁祸首。
如果没有,这将打算围绕问题打印一些上下文。
egrep -o '.{199}n4536.{99}' new.min.js
答案 2 :(得分:6)
Angular的注入器有3种方法可以解决依赖关系:
<强> 1。从函数参数名称中推断出依赖关系。这在所有角度的例子中最常用,例如
app.controller('MyController', function($scope, MyService) { ... });
在这种情况下,注入器将函数转换为字符串,解析参数名称并查找与该名称匹配的services / factories / anything-else。
<强> 2。内联注释。您可能还会遇到以下语法:
app.controller('MyController', ['$scope', 'MyService', function($scope, MyService) { ... }]);
在这种情况下,您可以使注入器更容易,因为您明确说明了所需的依赖项名称。名称用引号括起来,js minifiers不修改代码中的字符串。
第3。内联注释作为属性。如果将控制器定义为函数,则可以在特殊属性$inject
中设置注释:
function MyController($scope, MyService) {...}
MyController.$inject = ['$scope', 'MyService'];
在这种情况下,我们还明确说明了依赖关系。
我的猜测是你正在使用解决方案。 1.一旦minifier更改了隐式定义的依赖项的名称,注入器就不再知道你的函数的依赖性是什么。要解决这个问题,你应该使用第二种或第三种注释依赖关系的方式。
答案 3 :(得分:3)
虽然如果你不知道在哪里看,似乎没有任何好方法来调试这些DI问题,但我有一种感觉我的处于一个不太明显的地方......它是:
App.Services = angular.module('spokenvote.services', ['ngResource', 'ngCookies'])
.config(servicesConfig)
.run(($rootScope, $location) -> $rootScope.location = $location)
需要:
App.Services = angular.module('spokenvote.services', ['ngResource', 'ngCookies'])
.config(servicesConfig)
.run(['$rootScope', '$location', ($rootScope, $location) -> $rootScope.location = $location])