web-dev-qa-db-fra.com

angulaire js fournisseur inconnu

J'essaie de "personnaliser" l'exemple mongolab pour qu'il s'adapte à ma propre API REST. Maintenant, je rencontre cette erreur et je ne suis pas sûr de ce que je fais mal:

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)

Ceci est mon contrôleur:

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

et voici le module:

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

      return Product;
    }]);
149
Stefan Ernst

Votre code a l'air bien, en fait il fonctionne (à part les appels eux-mêmes) lorsqu'il est copié et collé dans un exemple jsFiddle: http://jsfiddle.net/VGaWD/

Difficile de dire ce qui se passe sans voir un exemple plus complet mais j’espère que le jsFiddle ci-dessus sera utile. _ {Je soupçonne que vous n'initialisez pas votre application avec le module 'productServices'}. Cela donnerait la même erreur, on peut le voir dans un autre jsFiddle: http://jsfiddle.net/a69nX/1/

Si vous envisagez de travailler avec AngularJS et MongoLab Je suggérerais d'utiliser un adaptateur existant pour la ressource $ et MongoLab: https://github.com/pkozlowski-opensource/angularjs-mongolab Il facilite beaucoup la tâche avec MongoLab, vous pouvez le voir en action ici: http://jsfiddle.net/pkozlowski_opensource/DP4Rh/ Avertissement. Je maintiens cet adaptateur (basé sur des exemples AngularJS) donc je suis évidemment biaisé ici.

129

J'ai eu cette erreur parce que je passais un paramètre incorrect à la définition d'usine. J'ai eu:

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

Cela fonctionnait lorsque j'ai supprimé le $scope et modifié la définition d'usine en: 

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

Si vous devez injecter $scope, utilisez:

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

Je viens d'avoir un problème similaire ... L'erreur dit la même chose dans la question, a essayé de le résoudre avec la réponse de pkozlowski.opensource et Ben G, qui sont tous deux corrects et bons. 

Mon problème était en effet différent avec la même erreur:

dans mon code HTML, j'avais l'initialisation comme ça ...

<html ng-app>

Un peu plus bas, j'ai essayé de faire quelque chose comme ça:

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

Je me suis débarrassé du premier ... alors cela a fonctionné ... évidemment vous ne pouvez pas initialiser ng-app deux fois ou plus. C'est suffisant.

J'ai totalement oublié le premier "ng-app" et j'ai été totalement frustré. Peut-être que ça va aider quelqu'un un jour ...

32
Preexo

Assurez-vous que votre app.js principal inclut les services dont il dépend. Par exemple: 

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

la réponse de pkozlowski est correcte, mais juste au cas où cela arriverait à quelqu'un d'autre, j'ai eu la même erreur après avoir créé le même module deux fois par erreur; la deuxième définition prévalait sur le fournisseur de la première: 

J'ai créé le module en faisant

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

puis un peu plus loin dans le même fichier:

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

La bonne façon de faire est: 

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

Dans mon cas, j'ai défini un nouveau fournisseur, disons, xyz

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

Lorsque vous configurez le fournisseur ci-dessus, vous devez l'injecter avec la chaîne Provider ajoutée -> xyz devient xyzProvider.

Ex:

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

Si vous injectez le fournisseur ci-dessus sans la chaîne 'Fournisseur', vous obtiendrez une erreur similaire dans OP.

11
manikanta

Pour ajouter ma propre expérience ici, j'essayais d'injecter un service dans l'une de mes fonctions de configuration de module. Ce paragraphe de la documentation que j'ai finalement trouvé explique pourquoi cela ne fonctionne pas:

Lors du démarrage de l'application, avant de créer tous les services, Angular configure et instancie tous les fournisseurs. Nous appelons cela la phase de configuration du cycle de vie de l'application. Au cours de cette phase, les services ne sont pas accessibles car ils n’ont pas encore été créés.

Cela signifie que vous pouvez injecter des fournisseurs dans les fonctions module.config (...), mais vous ne pouvez pas injecter de services, vous devez donc attendre que module.run (...) ou exposer un fournisseur que vous pouvez injecter à module. config

5
Stewart A

Pour moi, cette erreur a été causée par l'exécution de la version abrégée de mon application angulaire. Les documents angulaires suggèrent un moyen de contourner ce problème. Voici la citation appropriée décrivant le problème, et vous pouvez trouver la solution proposée dans les docs eux-mêmes ici :

Note sur la minification Dans la mesure où Angular déduit les dépendances du contrôleur à partir des noms des arguments de la fonction constructeur du contrôleur, si vous réduisez le code JavaScript du contrôleur PhoneListCtrl, tous ses arguments de fonction seront également réduits et l'injecteur de dépendances ne pourra services correctement.

4
Sasha

Cela m'a pris beaucoup trop de temps à traquer. Assurez-vous de minisafe votre contrôleur dans votre directive.

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

  return {

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

    }]
  }
}

J'espère que cela pourra aider

4
pk1m

Encore un autre cas où cette erreur se produira, si votre service est défini dans un fichier javascript séparé, veillez à le référencer! Oui, je sais, erreur de recrue.

3
Jason

Etant donné que c’est le meilleur résultat pour "angularjs unknown provider" sur Google en ce moment, en voici un autre. Lorsque vous effectuez des tests unitaires avec Jasmine, assurez-vous que cette déclaration figure dans votre fonction beforeEach():

module('moduleName'); 

Sinon, vous obtiendrez la même erreur lors de vos tests.

3
roufamatic

Dans mon cas, j'ai utilisé une fonction anonyme comme wrapper pour le module angulaire, comme ceci:

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

Après avoir fermé la parenthèse, j'ai oublié d'appeler la fonction anonyme en ouvrant et en fermant à nouveau les parenthèses comme ci-dessus.

1
Emanuele Bellini

Voici un autre scénario possible où vous pouvez voir cette erreur:

Si vous utilisez Sublime Text 2 et le plugin angular, il générera des stubs comme celui-ci.

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

        }
    }
]);

remarquez le '' vide comme premier élément du tableau après la chaîne 'utilFactory'. Si vous n'avez pas de dépendances, supprimez-le, c'est comme ça:

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

        }
    }
]);
1
dustin.schultz

J'oubliais d'injecter le fichier qui contenait complètement mes services. N'oubliez pas de le faire lors de l'initialisation de votre module d'application:

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

Le problème pour moi était qu'il y avait quelques nouveaux fichiers javascript que j'ai créés et qui faisaient référence au service. Pourtant, Chrome ne voyait que l'ancienne version. Un CTRL + F5 l'a corrigé pour moi.

1
mortey

Pour moi, le problème était le chargement paresseux; J'ai chargé mon contrôleur et le service en retard, de sorte qu'ils n'étaient pas disponibles au chargement de la page (et à l'initialisation angulaire). Je l'ai fait avec une balise ui-if, mais ce n'est pas pertinent… .. La solution a été de charger le service avec le chargement de page déjà.

1
Gonfi den Tschal

Puisque cette question est top google result, je vais ajouter une autre chose possible à la liste. 

Si le module que vous utilisez rencontre un échec sur l'encapsuleur d'injection de dépendance, il produit le même résultat. Par exemple, copier et coller des modules sur Internet peut s’appuyer sur underscore.js et tenter d’injecter avec «_» dans le di wrapper. S'il n'y a pas de trait de soulignement dans vos fournisseurs de dépendance de projet, lorsque votre contrôleur tente de référencer la fabrique de votre module, il obtiendra le «fournisseur inconnu» de votre fabrique dans le journal de la console du navigateur.

1
user1082202

Dans mon application Ruby on Rails, j'avais effectué les opérations suivantes:

rake assets:precompile

Cela a été fait dans l'environnement de 'développement', qui avait réduit Angular.js et l'avait inclus dans le fichier /public/assets/application.js.

Supprimer les fichiers /public/assets/* a résolu le problème pour moi.

0

J'ai eu une erreur de "fournisseur inconnu" liée à angular-mock (ngMockE2E) lors de la compilation de mon projet avec Grunt. Le problème était que les simulacres angulaires ne pouvaient pas être minifiés, j'ai donc dû le supprimer de la liste des fichiers minifiés.

0
Rusty Fausak

Mon scénario est peut-être un peu obscur, mais il peut causer la même erreur et être vécu par quelqu'un, alors:

Lors de l'utilisation du service $ controller pour instancier un nouveau contrôleur (qui attendait '$ scope' en tant que premier argument injecté), je passais la portée locale du nouveau contrôleur dans le second paramètre de la fonction $ controller (). Cela a amené Angular à essayer d’invoquer un service $ scope qui n’existait pas ( même si, pendant un moment, j’ai pensé que je supprimerais le service '$ scope' du cache d’Angular ). La solution consiste à envelopper la portée locale dans un objet locals:

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

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

Aucune des réponses ci-dessus n'a fonctionné pour moi, peut-être que je me trompais complètement, mais en tant que débutant, c'est ce que nous faisons.

J'étais en train d'initialiser le contrôleur dans une div afin d'avoir une liste:

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

Et ensuite, en utilisant $routeProvider pour mapper une URL sur le même contrôleur. Dès que j'ai supprimé le ng-init, le contrôleur a travaillé avec la route.

0
jfs.csantos

Encore une autre possibilité.

J'ai eu unknown Provider <- <- nameOfMyService. L'erreur a été causée par la syntaxe suivante:

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

Angular recherchait la dépendance ''.

0
Hugo Wood

Mon problème était avec Yeoman, en utilisant (en majuscule):

yo angular:factory Test

Fichiers créés (non capitalisés): 

app/scripts/services/test.js

mais le fichier index.html inclus (en majuscule):

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

J'espère que ça aide quelqu'un.

0
Corey Rothwell

J'ai fait face à un problème similaire aujourd'hui et les problèmes étaient vraiment très petits

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

Si vous observez le bloc ci-dessus, à la première ligne, vous remarquerez que j'ai injecté $ scope par erreur, ce qui est incorrect. J'ai supprimé cette dépendance indésirable pour résoudre le problème.

 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
Rakesh Burbure

Après avoir traité cette erreur aussi, je peux prendre en charge cette liste de réponses avec mon propre cas.

C'est à la fois simple et stupide (peut-être pas idiot pour les débutants comme moi, mais oui pour les experts), la référence de script à angular.min.js doit être la première de votre liste de scripts dans la page html.

Cela marche:

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

Ce n'est pas:

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

Avis sur le angular.min.js.

J'espère que ça aide n'importe qui !! :)

0
Joe Lewis

J'ai eu cette erreur après avoir créé une nouvelle usine et l'utiliser dans un composant, mais je n'ai pas vérifié les spécifications de ces composants.

donc si l'échec dans vos fichiers de test (spécifications)

vous devez ajouter beforeEach(module('YouNewServiceModule'));

0
Basheer AL-MOMANI

J'ai eu le même problème. J'ai corrigé cela en utilisant $('body').attr("ng-app", 'MyApp') au lieu de <body ng-app="MyApp"> pour amorcer. 

Parce que j'ai fait

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

pour les exigences d'architecture.

0
user2771370