angularjs未知提供商

我试图“定制”mongolab的例子,以适应我自己的REST API。 现在我遇到了这个错误,我不知道我在做什么错:

Error: Unknown provider: ProductProvider <- Product at Error (unknown source) at http://localhost:3000/js/vendor/angular.min.js:28:395 at Object.c [as get] (http://localhost:3000/js/vendor/angular.min.js:26:180) at http://localhost:3000/js/vendor/angular.min.js:28:476 at c (http://localhost:3000/js/vendor/angular.min.js:26:180) at d (http://localhost:3000/js/vendor/angular.min.js:26:314) 

这是我的控制者:

 function ProductListCtrl($scope, Product) { $scope.products = Product.query(); } 

这是模块:

 angular.module('productServices', ['ngResource']). factory('Product', ['$resource', function($resource){ var Product = $resource('/api/products/:id', { }, { update: { method: 'PUT' } }); return Product; }]); 

你的代码看起来不错,实际上它可以工作(除了调用本身),当复制和粘贴到示例jsFiddle: http : //jsfiddle.net/VGaWD/

很难说没有看到一个更完整的例子,但我希望上面的jsFiddle会有所帮助。 我怀疑的是,你没有使用“productServices”模块初始化你的应用程序 。 它会给出同样的错误,我们可以在另一个jsFiddle中看到这个: http : //jsfiddle.net/a69nX/1/

如果您打算使用AngularJS和MongoLab, 我会build议使用$ resource和MongoLab的现有适配器 : https : //github.com/pkozlowski-opensource/angularjs-mongolab它缓解了使用MongoLab的许多痛苦,您可以在这里看到它的行动: http : //jsfiddle.net/pkozlowski_opensource/DP4Rh/免责声明! 我维护这个适配器(基于AngularJS示例编写的),所以我明显偏向这里。

我得到了这个错误,因为我传递了一个不正确的参数给工厂定义。 我有:

 myModule.factory('myService', function($scope, $http)... 

它工作时,我删除了$scope ,并将工厂定义更改为:

 myModule.factory('myService', function( $http)... 

如果您需要注入$scope ,请使用:

 myModule.factory('myService', function($rootScope, $http)... 

我刚刚有一个类似的问题。 这个错误在问题中说的是一样的,试图用pkozlowski.opensource和Ben G的答案来解决这个问题,这两个答案都是正确的和好的。

我的问题确实不同于同样的错误:

在我的HTML代码,我有这样的初始化…

 <html ng-app> 

进一步下去,我试图做这样的事情:

 <div id="cartView" ng-app="myApp" ng-controller="CartCtrl"> 

我摆脱了第一个…然后它的工作…显然你不能初始化ng-app两次或更多次。 很公平。

我总是忘记了第一个“ng-app”,并感到沮丧。 也许这是要帮助别人oneday …

确保你的主app.js包含它所依赖的服务。 例如:

 /* App Module */ angular.module('myApp', ['productServices']). ..... 

pkozlowski的回答是正确的,但为了防止这种情况发生在其他人身上,我错误地创build了两次相同的模块后出现同样的错误。 第二个定义是压倒第一个提供者:

我通过做了创build模块

 angular.module('MyService'... ).factory(...); 

然后在同一个文件中进一步下去:

 angular.module('MyService'... ).value('version','0.1'); 

正确的做法是:

 angular.module('MyService'... ).factory(...).value('version','0.1'); 

就我而言,我已经定义了一个新的提供者,比如xyz

 angular.module('test') .provider('xyz', function () { .... }); 

当你configuration上面的提供者时,你必须注入Providerstring – > xyz变成xyzProvider

例如:

 angular.module('App', ['test']) .config(function (xyzProvider) { // do something with xyzProvider.... }); 

如果您注入上述提供程序而不使用“Provider”string,则会在OP中看到类似的错误。

在JS文件结束我closures了工厂function

});

代替

}());

对我来说,这个错误是由我的angular度应用程序的缩小版本运行引起的。 Angular docs提供了解决这个问题的方法。 下面是描述问题的相关引用,您可以在文档中findbuild议的解决scheme:

关于缩小的注意事项由于Angular从控制器的构造函数的参数名称推断了控制器的依赖关系,如果要缩小PhoneListCtrl控制器的JavaScript代码,则其所有函数参数也将被缩小,而dependency injection器将不会能够正确识别服务。

这花了我太多时间来追查。 确保你在你的指令中使用你的控制器。

 .directive('my_directive', ['injected_item', function (injected_item){ return { controller: ['DO_IT_HERE_TOO', function(DO_IT_HERE_TOO){ }] } } 

希望有所帮助

在这里添加我自己的经验,我试图注入一个服务到我的模块configurationfunction之一。 我最终发现的文档中的这一段解释了为什么这样做不起作用:

在应用程序引导期间,在Angular创build所有服务之前,它会configuration并实例化所有提供程序。 我们称之为应用程序生命周期的configuration阶段。 在这个阶段,服务不可访问,因为它们还没有被创build。

意思是你可以注入提供程序到module.config(…)函数,但是你不能注入服务,因为你需要等到module.run(…),或者暴露一个你可以注入模块的提供者。configuration

由于这是谷歌眼下“极客未知提供商”的最高结果,这里还有一个疑问。 在使用Jasmine进行unit testing时,请确保在beforeEach()函数中包含以下语句:

 module('moduleName'); 

否则在testing中会出现同样的错误。

还有另外一个这样的错误会发生,如果你的服务是在一个单独的JavaScript文件中定义的,请确保你引用它! 是的,我知道,菜鸟的错误。

对我来说问题是懒加载; 我加载我的控制器和服务迟了,所以他们不能在页面加载(和angular度初始化)。 我用ui-if标签做了这个,但是这是不相关的。 解决scheme是用页面加载已经加载服务。

这是另一种可能的情况,你可以看到这个错误:

如果你使用Sublime Text 2和angular插件,它会生成这样的存根

 angular.module('utils', []) .factory('utilFactory', ['' function() { return { } } ]); 

在'utilFactory'string之后注意空的''作为数组的第一个元素。 如果你没有任何依赖关系,那么删除它就像这样:

 angular.module('utils', []) .factory('utilFactory', [ function() { return { } } ]); 

我忘了注入完全保存我的服务的文件。 请记住在初始化您的应用程序模块时执行此操作:

 angular.module('myApp', ['myApp.services', ... ]); 

由于这个问题是最好的谷歌结果,我会添加另一个可能的事情的名单。

如果您正在使用的模块在dependency injection包装器上发生故障,它将提供相同的结果。 例如,来自互联网的复制和粘贴模块可能依赖于underscore.js,并尝试在di封装中注入“_”。 如果您的项目依赖项提供程序中不存在下划线,则当您的控制器尝试引用您的模块工厂时,它将在浏览器的控制台日志中为您的工厂获取“未知提供者”。

对我来说,问题是我创build了一些新的JavaScript文件引用了服务,但Chrome只看到了旧版本。 一个CTRL + F5为我修好了。

就我而言,我使用匿名函数作为angular度模块的包装,如下所示:

 (function () { var app = angular.module('myModule', []); ... })(); 

closures圆括号之后,我忘了通过再次打开和closures括号来调用匿名函数。

当用Grunt编译我的项目时,我得到了与angular-mocks(ngMockE2E)相关的“unknown provider”错误。 问题是angular度嘲笑不能被缩小,所以我不得不将它从缩小文件列表中删除。

在处理了这个错误之后,我可以用自己的情况来支持这个答案列表。

同时又简单又笨拙(对于像我这样的初学者也许并不愚蠢,但对于专家来说,是的),对于angular.min.js脚本的引用必须是html页面脚本列表中的第一个脚本。

这工作:

 <script src="Scripts/angular.min.js"></script> <script src="MyScripts/MyCartController.js"></script> <script src="MyScripts/MyShoppingModule.js"></script> 

这不是:

 <script src="MyScripts/MyCartController.js"></script> <script src="MyScripts/MyShoppingModule.js"></script> <script src="Scripts/angular.min.js"></script> 

关于angular.min.js的通知。

希望它有助于任何人! 🙂

我的问题是与Yeoman,使用(大写):

 yo angular:factory Test 

制作文件(非大写):

 app/scripts/services/test.js 

但包含index.html文件(大写):

 <script src="scripts/services/Test.js"></script> 

希望这有助于某人。

又一个可能性。

我有unknown Provider <- <- nameOfMyService 。 错误是由以下语法引起的:

 module.factory(['', function() { ... }]); 

Angular正在寻找''依赖”。

我的情况可能会有点模糊,但它可能会导致同样的错误,有人可能会遇到它,所以:

当使用$控制器服务实例化一个新的控制器(期待“$ scope”作为它的第一个注入参数)时,我将新控制器的本地范围传递给$ controller()函数的第二个参数。 这导致Angular试图调用一个不存在的$ scope服务( 虽然,有一段时间,我真的认为我会从Angular的caching中删除'$ scope'服务 )。 解决方法是将本地作用域包装在本地对象中:

 // Bad: $controller('myController', newScope); // Good: $controller('myController, {$scope: newScope}); 

上面的答案都没有为我工作,也许我做了完全错误的,但作为一个初学者,这就是我们所做的。

我正在初始化一个div的控制器,以获得一个列表:

  <div ng-controller="CategoryController" ng-init="initialize()"> 

然后使用$routeProvider将URL映射到同一个控制器。 一旦我删除了ng-init ,控制器就处理了这个路由。

我有同样的问题。 我修正了使用$('body').attr("ng-app", 'MyApp')而不是<body ng-app="MyApp">来提升。

因为我做了

 angular.element(document).ready(function () { angular.bootstrap(document, [App.Config.Settings.AppName]); }) 

为架构要求。

在我的Ruby on Rails应用程序中,我完成了以下工作:

 rake assets:precompile 

这是在“开发”环境中完成的,它已经缩小了Angular.js并将其包含在/public/assets/application.js文件中。

删除/public/assets/*文件解决了我的问题。

今天我面临类似的问题,问题真的很小

  app.directive('removeFriend', function($scope) { return { restrict: 'E', templateUrl: 'removeFriend.html', controller: function($scope) { $scope.removing = false; $scope.startRemove = function() { $scope.removing = true; } $scope.cancelRemove = function() { $scope.removing = false; } $scope.removeFriend = function(friend) { var idx = $scope.user.friends.indexOf(friend) if (idx > -1) { $scope.user.friends.splice(idx, 1); } } } } }); 

如果你观察上面的代码块,在第一行你会发现我错误地注入了$ scope,这是不正确的。 我删除了不需要的依赖项来解决问题。

  app.directive('removeFriend', function() { return { restrict: 'E', templateUrl: 'removeFriend.html', controller: function($scope) { $scope.removing = false; $scope.startRemove = function() { $scope.removing = true; } $scope.cancelRemove = function() { $scope.removing = false; } $scope.removeFriend = function(friend) { var idx = $scope.user.friends.indexOf(friend) if (idx > -1) { $scope.user.friends.splice(idx, 1); } } } } }); 

另一个“疑难杂症”:我得到这个错误注入$超时,并花了几分钟的时间才意识到我有空格的数组值。 这不会工作:

 angular.module('myapp',[]. controller('myCtrl', ['$scope', '$timeout ', function ($scope, $timeout){ //controller logic } ]); 

张贴只是为了以防其他人有这样的一个愚蠢的错误。

我的情况是狡猾的打字

 myApp.factory('Notify',funtion(){ 

函数有一个'c'!