Ich versuche, das Mongolab-Beispiel an meine eigene REST-API anzupassen. Jetzt stoße ich auf diesen Fehler und bin mir nicht sicher, was ich falsch mache:
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)
Das ist mein Controller:
function ProductListCtrl($scope, Product) {
$scope.products = Product.query();
}
und das ist das Modul:
angular.module('productServices', ['ngResource']).
factory('Product', ['$resource', function($resource){
var Product = $resource('/api/products/:id', { }, {
update: { method: 'PUT' }
});
return Product;
}]);
Antworten:
Ihr Code sieht gut aus, tatsächlich funktioniert er (abgesehen von den Aufrufen selbst), wenn er in ein Beispiel kopiert und eingefügt wird. JsFiddle: http://jsfiddle.net/VGaWD/
Schwer zu sagen, was los ist, ohne ein vollständigeres Beispiel zu sehen, aber ich hoffe, dass die obige jsFiddle hilfreich sein wird. Ich vermute, dass Sie Ihre App nicht mit dem Modul 'productServices' initialisieren . Es würde den gleichen Fehler geben, wir können dies in einem anderen jsFiddle sehen: http://jsfiddle.net/a69nX/1/
Wenn Sie planen, mit AngularJS und MongoLab zu arbeiten, würde ich empfehlen, einen vorhandenen Adapter für die $ resource und MongoLab zu verwenden : https://github.com/pkozlowski-opensource/angularjs-mongolab Es erleichtert Ihnen die Arbeit mit MongoLab erheblich kann es hier in Aktion sehen: http://jsfiddle.net/pkozlowski_opensource/DP4Rh/ Haftungsausschluss! Ich pflege diesen Adapter (geschrieben basierend auf AngularJS-Beispielen), daher bin ich hier offensichtlich voreingenommen.
quelle
<body ng-app="productServices">
und der andere hat<body ng-app="">
.Fiddle Options
Registerkarte auf der rechten SeiteIch habe diesen Fehler erhalten, weil ich einen falschen Parameter an die Factory-Definition übergeben habe. Ich hatte:
Es hat funktioniert, als ich das entfernt
$scope
und die Factory-Definition geändert habe in:Wenn Sie injizieren müssen
$scope
, verwenden Sie:quelle
Ich hatte gerade ein ähnliches Problem. Der Fehler sagte dasselbe in der Frage, versuchte ihn mit der Antwort von pkozlowski.opensource und Ben G zu lösen, die beide richtige und gute Antworten sind.
Mein Problem war in der Tat anders mit dem gleichen Fehler:
In meinem HTML-Code hatte ich die Initialisierung so ...
Etwas weiter unten habe ich versucht, so etwas zu tun:
Ich habe die erste losgeworden ... dann hat es funktioniert ... offensichtlich kann man ng-app nicht zweimal oder mehrmals initialisieren. Meinetwegen.
Ich habe die erste "ng-App" total vergessen und war total frustriert. Vielleicht hilft das jemandem eines Tages ...
quelle
Stellen Sie sicher, dass Ihr Hauptgerät
app.js
die Dienste enthält, von denen es abhängt. Beispielsweise:quelle
productServices
sollte es sich in einem solchen Fall um ein Modul handeln, daher ist es unerheblich, was sich in einem solchen Modul befindet (Dienste oder nicht).Die Antwort von pkozlowski ist richtig, aber für den Fall, dass dies jemand anderem passiert, hatte ich denselben Fehler, nachdem ich versehentlich dasselbe Modul zweimal erstellt hatte. Die zweite Definition hatte Vorrang vor dem Anbieter der ersten:
Ich habe das Modul dabei erstellt
dann etwas weiter unten in derselben Datei:
Der richtige Weg, dies zu tun, ist:
quelle
In meinem Fall habe ich einen neuen Anbieter definiert, z.
xyz
Wenn Sie den oben genannten Anbieter konfigurieren möchten, müssen Sie ihm eine
Provider
angehängte Zeichenfolge hinzufügen ->xyz
wirdxyzProvider
.Ex:
Wenn Sie den obigen Provider ohne die Zeichenfolge 'Provider' einfügen, wird im OP ein ähnlicher Fehler angezeigt.
quelle
Am Ende der JS-Datei, um die Factory-Funktion zu schließen, die ich hatte
});
anstatt
}());
quelle
})();
Ich habe viel zu lange gebraucht, um sie aufzuspüren. Stellen Sie sicher, dass Sie Ihren Controller innerhalb Ihrer Direktive minimieren.
hoffentlich hilft das
quelle
Um meine eigenen Erfahrungen hier hinzuzufügen, habe ich versucht, einen Dienst in eine meiner Modulkonfigurationsfunktionen einzufügen. Dieser Absatz aus den Dokumenten, die ich schließlich gefunden habe, erklärt, warum das nicht funktioniert:
Das heißt, Sie können Anbieter in die Funktionen von module.config (...) einfügen, aber Sie können keine Dienste einfügen. Dazu müssen Sie warten, bis module.run (...) ausgeführt wird, oder einen Anbieter verfügbar machen, den Sie in das Modul einfügen können. config
quelle
Für mich wurde dieser Fehler durch das Ausführen der minimierten Version meiner Winkel-App verursacht. Angular Docs schlagen eine Möglichkeit vor, dies zu umgehen. Hier ist das relevante Zitat, das das Problem beschreibt. Die vorgeschlagene Lösung finden Sie in den Dokumenten selbst hier :
quelle
Da dies derzeit das Top-Ergebnis für "anglejs unbekannter Anbieter" bei Google ist, ist hier ein weiteres Problem. Stellen Sie beim Testen von Einheiten mit Jasmine sicher, dass Sie diese Aussage in Ihrer
beforeEach()
Funktion haben:Andernfalls wird bei Ihren Tests derselbe Fehler angezeigt.
quelle
Ein weiterer Fall, in dem dieser Fehler auftritt: Wenn Ihr Dienst in einer separaten Javascript-Datei definiert ist, stellen Sie sicher, dass Sie darauf verweisen! Ja, ich weiß, Anfängerfehler.
quelle
Ich habe vergessen, die Datei zu injizieren, in der sich meine Dienste befanden. Denken Sie daran, dies zu tun, wenn Sie Ihr App-Modul initialisieren:
quelle
In meinem Fall habe ich eine anonyme Funktion als Wrapper für das Winkelmodul verwendet:
Nach dem Schließen der Klammer habe ich vergessen, die anonyme Funktion aufzurufen, indem ich die Klammern wie oben geöffnet und wieder geschlossen habe.
quelle
Für mich war das Problem das faule Laden; Ich habe meinen Controller und meinen Dienst zu spät geladen, sodass sie beim Laden der Seite (und bei der Angular-Initialisierung) nicht verfügbar waren. Ich habe das mit einem UI-If-Tag gemacht, aber das ist irrelevant. Die Lösung bestand darin, den Dienst bereits mit dem Laden der Seite zu laden.
quelle
Hier ist ein weiteres mögliches Szenario, in dem Sie diesen Fehler sehen können:
Wenn Sie Sublime Text 2 und das Winkel-Plugin verwenden, werden solche Stubs generiert
Beachten Sie das leere '' als erstes Element des Arrays nach der Zeichenfolge 'utilFactory'. Wenn Sie keine Abhängigkeiten haben, entfernen Sie diese, damit es so aussieht:
quelle
Da diese Frage das beste Google-Ergebnis ist, werde ich der Liste eine weitere mögliche Sache hinzufügen.
Wenn das von Ihnen verwendete Modul einen Fehler im Abhängigkeitsinjektions-Wrapper aufweist, liefert es dasselbe Ergebnis. Zum Beispiel können Copy & Paste-Module aus dem Internet auf underscore.js angewiesen sein und versuchen, '_' in den di-Wrapper einzufügen. Wenn in Ihren Projektabhängigkeitsanbietern kein Unterstrich vorhanden ist und Ihr Controller versucht, auf die Factory Ihres Moduls zu verweisen, wird im Konsolenprotokoll des Browsers ein "unbekannter Anbieter" für Ihre Factory angezeigt.
quelle
Das Problem für mich war, dass ich einige neue Javascript-Dateien erstellt habe, die auf den Dienst verweisen, Chrome jedoch nur die ältere Version sah. Ein STRG + F5 hat es für mich behoben.
quelle
Beim Kompilieren meines Projekts mit Grunt ist ein Fehler "Unbekannter Anbieter" im Zusammenhang mit Angular-Mocks (ngMockE2E) aufgetreten. Das Problem war, dass Angular-Mocks nicht minimiert werden können, sodass ich sie aus der Liste der minimierten Dateien entfernen musste.
quelle
Nachdem ich auch diesen Fehler behandelt habe, kann ich diese Liste von Antworten mit meinem eigenen Fall unterstützen.
Es ist gleichzeitig einfach und dumm (vielleicht nicht dumm für Anfänger wie mich, aber ja für Experten), der Skriptverweis auf angular.min.js muss der erste in Ihrer Liste von Skripten auf der HTML-Seite sein.
Das funktioniert:
Dies nicht:
Hinweis zu den angle.min.js.
Hoffe es hilft jedem !! :) :)
quelle
Mein Problem war mit Yeoman, mit (großgeschrieben):
Erstellte Dateien (nicht kapitalisiert):
aber die index.html Datei enthalten (groß geschrieben):
Hoffe das hilft jemandem.
quelle
Noch eine Möglichkeit.
Ich hatte
unknown Provider <- <- nameOfMyService
. Der Fehler wurde durch die folgende Syntax verursacht:Angular suchte nach der
''
Abhängigkeit.quelle
Mein Szenario mag etwas dunkel sein, aber es kann den gleichen Fehler verursachen und jemand kann ihn erleben, also:
Bei Verwendung des $ controller-Dienstes zum Instanziieren eines neuen Controllers (der als erstes injiziertes Argument '$ scope' erwartete) habe ich den lokalen Bereich des neuen Controllers an den zweiten Parameter der $ controller () -Funktion übergeben. Dies führte dazu, dass Angular versuchte, einen $ scope-Dienst aufzurufen, der nicht existiert ( obwohl ich für eine Weile tatsächlich dachte, ich hätte den '$ scope'-Dienst etwas aus Angulars Cache gelöscht ). Die Lösung besteht darin, den lokalen Bereich in ein lokales Objekt zu verpacken:
quelle
Keine der obigen Antworten hat bei mir funktioniert, vielleicht habe ich mich völlig geirrt, aber als Anfänger machen wir das auch.
Ich habe den Controller in a initialisiert
div
, um eine Liste zu haben:Und dann verwenden
$routeProvider
, um eine URL demselben Controller zuzuordnen. Sobald ichng-init
den Controller entfernt hatte, arbeitete der Controller mit der Route.quelle
Ich hatte das gleiche Problem. Ich habe das mit
$('body').attr("ng-app", 'MyApp')
anstatt behoben<body ng-app="MyApp">
Boostrap verwendet habe.Weil ich es getan habe
für Architekturanforderungen.
quelle
In meiner Ruby on Rails-App hatte ich Folgendes getan:
Dies geschah in der 'Entwicklungs'-Umgebung, die Angular.js minimiert und in die
/public/assets/application.js
Datei aufgenommen hatte.Das Entfernen der
/public/assets/*
Dateien löste das Problem für mich.quelle
Ich hatte heute ein ähnliches Problem und die Probleme waren wirklich sehr klein
Wenn Sie den obigen Block beobachten, werden Sie in der ersten Zeile feststellen, dass ich versehentlich $ scope injiziert habe, was falsch ist. Ich habe diese unerwünschte Abhängigkeit entfernt, um das Problem zu lösen.
quelle
Ich hatte diesen Fehler, nachdem ich eine neue Factory erstellt und innerhalb einer Komponente verwendet hatte, aber ich habe die Spezifikationen dieser Komponenten nicht überprüft
quelle
Ein weiteres 'Gotcha': Ich habe diesen Fehler beim Einfügen von $ timeout erhalten, und es dauerte einige Minuten, bis mir klar wurde, dass die Array-Werte Leerzeichen enthielten. Dies wird nicht funktionieren:
Posting nur für den Fall, dass jemand anderes einen dummen Fehler wie diesen hat.
quelle
Mein Fall war zwielichtiges Tippen
Funktion hat ein 'c'!
quelle