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上面的提供者时,你必须注入Provider
string – > 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'!