角度未知提供者

我试图“定制”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;
}]);
282916 次浏览

您的代码看起来很好,实际上当复制并粘贴到示例 jsFiddle: http://jsfiddle.net/VGaWD/中时,它可以工作(除了调用本身之外)

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

如果你计划使用 AngularJS 和 MongoLab 的 我建议为 $resource 和 MongoLab 使用现有的适配器: pkozlowski-opensource/AngularJS-MongoLab https://github.com/pkozlowski-opensource/AngularJS-MongoLab 它减轻了 MongoLab 工作的许多痛苦,您可以在这里看到它的实际运行: http://jsfiddle.net/pkozlowski_opensource/DP4Rh/ 免责声明! 我正在维护这个适配器(基于 AngularJS 示例编写) ,所以我在这里显然有偏见。

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

我创建了这个模块

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

然后在同一个文件中再往下一点:

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

正确的做法是:

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

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

我的问题的确与同一个错误不同:

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

<html ng-app>

再往下一点,我试着这样做:

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

我摆脱了第一个... 然后它工作... 很明显,你不能初始化 n-app 两次或更多次。有道理。

我完全忘记了第一个“ n-app”,感到非常沮丧。也许有一天这会帮助某人... ..。

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

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

另一个“陷阱”: 我在注入 $timeout 时遇到了这个错误,花了几分钟才意识到数组值中有空格。这是行不通的:

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

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

对我来说,问题在于延迟加载; 我加载控制器和服务的时间较晚,所以在页面加载时(以及角度初始化时)它们不可用。我使用了 ui-if 标记,但这与本文无关。 解决方案是使用页面加载来加载服务。

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

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

当我删除 $scope并将工厂定义改为:

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

如果你需要注射 $scope,使用:

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

由于这是谷歌上“ angularjs 未知提供商”的最高搜索结果,这里还有另一个陷阱。在使用 Jasmine 进行单元测试时,请确保在 beforeEach()函数中包含以下语句:

module('moduleName');

否则,您将在测试中得到同样的错误。

在我的例子中,我定义了一个新的提供程序,比如 xyz

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

当您要配置上面的提供程序时,您必须注入附加的 Provider字符串—— > xyz变成 xyzProvider

例如:

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

如果注入上面的提供程序时没有注入“ Provider”字符串,那么在 OP 中会得到类似的错误。

在使用 Grunt 编译我的项目时,我得到了一个与角度模拟(ngMockE2E)相关的“未知提供者”错误。问题是角度模拟不能被缩小,所以我必须把它从缩小文件列表中删除。

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

rake assets:precompile

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

删除 /public/assets/*文件为我解决了这个问题。

对我来说,这个错误是由于运行我的角度应用程序的缩小版本造成的。有角度的医生提出了一个解决办法。下面是描述这个问题的相关引文,你可以在文档本身 给你中找到建议的解决方案:

关于缩小的一个注记 因为 Angular 从参数的名称到控制器的构造函数推断控制器的依赖关系,如果你要缩小 PhoneListCtrl 控制器的 JavaScript 代码,它所有的函数参数也会被缩小,依赖注入器将无法正确识别服务。

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

它既简单又愚蠢(对于像我这样的初学者来说可能不愚蠢,但对于专家来说是的) ,对 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。

希望对大家有所帮助! ! :)

我的案子输入有问题

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

函数有个“ c”!

我的问题在于约曼使用(大写) :

yo angular:factory Test

制作文件(未大写) :

app/scripts/services/test.js

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

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

希望这对谁有帮助。

这花了我太长的时间来追踪。请确保您迷你安全您的控制器在您的指令。

.directive('my_directive', ['injected_item', function (injected_item){


return {


controller: ['DO_IT_HERE_TOO', function(DO_IT_HERE_TOO){


}]
}
}

希望能帮上忙

还有另一种可能。

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

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

Angular 在寻找 ''依赖。

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

当使用 $controller 服务来实例化一个新控制器时(它期望“ $scope”作为它的第一个注入参数) ,我将新控制器的本地作用域传递给 $controller ()函数的第二个参数。这导致 Angular 尝试调用不存在的 $scope 服务(不过,有一段时间,我确实认为自己已经从 Angular 的缓存中删除了“ $scope”服务)。解决方案是将本地作用域包装在局部变量对象中:

// Bad:
$controller('myController', newScope);


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

下面是另一个可能的场景,您可以看到这个错误:

如果你使用升华文本2和角插件,它将生成这样的存根

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


}
}
]);

注意,空’’是数组中‘ utilFactory’字符串之后的第一个元素。如果你没有任何依赖关系,删除它,如下所示:

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


}
}
]);

我忘了注入我所有服务的文件了。在初始化应用程序模块时,请记住这样做:

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

以上的答案对我来说都不管用,也许我完全做错了,但是作为一个初学者,这就是我们要做的。

我在 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]);
})

架构需求。

因为这个问题是顶部谷歌结果,我将添加另一个可能的事情列表。

如果您正在使用的模块在依赖注入包装器上出现故障,它将提供相同的结果。例如,从 Internet 复制和粘贴模块可能依赖 underscore.js,并尝试在 di 包装器中注入“ _”。如果下划线在项目依赖提供程序中不存在,当控制器试图引用模块的工厂时,它将在浏览器的控制台日志中为您的工厂获得“未知提供程序”。

如果您的服务是在一个单独的 javascript 文件中定义的,那么还有一种情况会发生这种错误,请确保您引用了它!是的,我知道,低级错误。

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

为了在这里增加我自己的经验,我尝试将一个服务注入到我的一个模块配置函数中。我最终找到的文档中的这一段解释了为什么这种方法行不通:

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

这意味着您可以将提供程序注入到 module.config (...)函数中,但是您不能注入服务,因为您需要等到 module.run (...) ,或者公开可以注入到 module.config 中的提供程序

在我的例子中,我使用了一个匿名函数作为角度模块的包装器,如下所示:

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

关闭括号后,我忘记像上面那样再次打开和关闭括号来调用匿名函数。

在 JS 文件的末尾关闭了我的工厂函数

});

而不是

}());

我今天遇到了类似的问题,而且问题真的很小

 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);
}
}
}
}
});

在创建了一个新工厂并在组件中使用它之后,我出现了这个错误,但是我没有检查那个组件的规格

因此,如果在您的(规格说明书)测试文件中出现故障

你需要加入 beforeEach(module('YouNewServiceModule'));