angular js未知提供商

Ste*_*nst 152 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)
Run Code Online (Sandbox Code Playgroud)

这是我的控制器:

function ProductListCtrl($scope, Product) {
  $scope.products = Product.query();
}
Run Code Online (Sandbox Code Playgroud)

这是模块:

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

      return Product;
    }]);
Run Code Online (Sandbox Code Playgroud)

pko*_*rce 130

你的代码看起来不错,实际上它复制并粘贴到一个示例jsFiddle中时(除了调用本身):http://jsfiddle.net/VGaWD/

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

如果您打算使用AngularJS和MongoLab,我建议使用$ resource和MongoLab的现有适配器:https://github.com/pkozlowski-opensource/angularjs-mongolab 它减轻了使用MongoLab的大部分痛苦,你可以在这里看到它:http://jsfiddle.net/pkozlowski_opensource/DP4Rh/ 免责声明!我正在维护这个适配器(基于AngularJS示例编写),所以我显然有偏见.

  • 大家好,这有点尴尬.我有完全一样的问题.但我无法发现2 jsFiddles之间的区别.任何关于在哪里看到的确切提示都非常感激. (16认同)
  • @schacki,可以在信息选项卡中找到小提琴的区别.其中一个有一个带有`<body ng-app ="productServices">`的主体,另一个有`<body ng-app ="">`. (4认同)
  • 看起来信息选项卡现在是右侧的"小提琴选项"选项卡 (3认同)

bre*_*per 40

我收到了这个错误,因为我将错误的参数传递给工厂定义.我有:

myModule.factory('myService', function($scope, $http)...
Run Code Online (Sandbox Code Playgroud)

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

myModule.factory('myService', function( $http)...
Run Code Online (Sandbox Code Playgroud)

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

myModule.factory('myService', function($rootScope, $http)...
Run Code Online (Sandbox Code Playgroud)


Pre*_*exo 32

我刚遇到类似的问题.错误说同样的问题,试图用pkozlowski.opensource和Ben G的答案解决它,这两个都是正确和好的答案.

我的问题确实与同样的错误有所不同:

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

<html ng-app>
Run Code Online (Sandbox Code Playgroud)

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

<div id="cartView" ng-app="myApp" ng-controller="CartCtrl">
Run Code Online (Sandbox Code Playgroud)

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

我完全忘记了第一个"ng-app"并且总是感到沮丧.也许这会帮助一些人...

  • 我有一个类似的问题但在我的情况下**在div**中指定了ng-controller是引用该服务的控制器的罪魁祸首.似乎Angular在解析视图时不知道如何解析服务. (2认同)

小智 25

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

/* App Module */
angular.module('myApp', ['productServices']). 
.....
Run Code Online (Sandbox Code Playgroud)


Ben*_*n G 17

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

我做了创建模块

angular.module('MyService'...
).factory(...);
Run Code Online (Sandbox Code Playgroud)

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

angular.module('MyService'...
).value('version','0.1');
Run Code Online (Sandbox Code Playgroud)

这样做的正确方法是:

angular.module('MyService'...
).factory(...).value('version','0.1');
Run Code Online (Sandbox Code Playgroud)


man*_*nta 11

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

angular.module('test')
.provider('xyz', function () {
    ....
});
Run Code Online (Sandbox Code Playgroud)

当你配置上面的提供者时,你要用Provider附加的字符串注入它- > xyz成为xyzProvider.

例如:

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

如果您在没有'Provider'字符串的情况下注入上述提供程序,您将在OP中获得类似的错误.


小智 8

在JS文件的末尾关闭我的工厂功能

});

代替

}());


pk1*_*k1m 5

这花了我很长时间才能追踪。确保在指令内对控制器进行迷你安全。

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

  return {

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

    }]
  }
}
Run Code Online (Sandbox Code Playgroud)

希望能有所帮助


Ste*_*t A 5

为了在这里添加我自己的经验,我试图将一个服务注入我的一个模块配置功能.我最终找到的文档中的这一段解释了为什么这不起作用:

在应用程序引导期间,在Angular创建所有服务之前,它会配置并实例化所有提供程序.我们称之为应用程序生命周期的配置阶段.在此阶段,服务无法访问,因为尚未创建服务.

这意味着你可以将提供者注入module.config(...)函数,但你不能注入服务,因为你需要等到module.run(...),或者暴露你可以注入模块的提供者.配置