AngularJS未知的提供者。

158

我试图将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;
    }]);

这个错误表示Angular不知道产品工厂,确保首先引用此服务的JS。另外,在声明模块时,请确保明确定义依赖项,因为当文件被最小化时,由于名称混淆,也会出现此错误。有关更多信息,请参阅此文章:http://www.ozkary.com/2015/11/angularjs-minimized-file-unknown-provider.html - ozkary
你可能需要检查routes.js文件,以查看当前URL路径是否已在页面上加载了必要的提供程序。 - shasi kanth
30个回答

0

今天我遇到了类似的问题,而且问题其实非常小。

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

0

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

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

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


0

我在创建新工厂并在组件中使用它后出现了这个错误,但我没有检查该组件的规格说明。

所以如果你的(规格说明)测试文件失败了

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


0
在使用Grunt编译我的项目时,我遇到了与angular-mocks(ngMockE2E)相关的“未知提供程序”错误。问题在于angular-mocks无法被压缩,因此我必须将其从压缩文件列表中删除。

0

我遇到的情况可能有点晦涩,但它会导致同样的错误,其他人也可能会遇到这个问题,所以:

当使用 $controller 服务实例化一个新的控制器(该控制器期望 '$scope' 作为它的第一个注入参数)时,我将新控制器的本地作用域传递给了 $controller() 函数的第二个参数。这导致 Angular 尝试调用一个不存在的 $scope 服务(尽管在一段时间里,我实际上认为我已经从 Angular 的缓存中删除了 '$scope' 服务)。解决方法是将局部作用域包装在 locals 对象中:

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

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

0

另一种可能性。

我遇到了unknown Provider <- <- nameOfMyService的问题。这个错误是由以下语法引起的:

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

Angular 正在寻找 '' 依赖项。


错误:[$injector:unpr] 未知提供者:LoginFactoryProvider <- LoginFactory。我有这个问题,该怎么解决呢? - ninjaXnado

0

我的问题出在使用 Yeoman 时,需要将其首字母大写:

yo angular:factory Test

生成的文件(小写):

app/scripts/services/test.js

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

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

希望这能帮助到某个人。


0
在我的 Ruby on Rails 应用程序中,我已经完成了以下操作:
rake assets:precompile

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

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


-1
另一个需要注意的地方:我注入$timeout时出现了错误,花了几分钟才意识到数组值中有空格。这是行不通的:
angular.module('myapp',[].
  controller('myCtrl', ['$scope', '$timeout ', 
    function ($scope, $timeout){
      //controller logic
    }
  ]);

发帖只是为了防止其他人犯类似的愚蠢错误。


-2

我的情况是打字有点不准确

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

函数有个 'c'!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接