Próbuję „dostosować” przykład mongolabu, aby pasował do mojego własnego interfejsu API REST. Teraz napotykam ten błąd i nie jestem pewien, co robię źle:
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)
To jest mój kontroler:
function ProductListCtrl($scope, Product) {
$scope.products = Product.query();
}
a to jest moduł:
angular.module('productServices', ['ngResource']).
factory('Product', ['$resource', function($resource){
var Product = $resource('/api/products/:id', { }, {
update: { method: 'PUT' }
});
return Product;
}]);
Odpowiedzi:
Twój kod wygląda dobrze, w rzeczywistości działa (oprócz samych wywołań) po skopiowaniu i wklejeniu do przykładowego pliku jsFiddle: http://jsfiddle.net/VGaWD/
Trudno powiedzieć, co się dzieje, nie widząc pełniejszego przykładu, ale mam nadzieję, że powyższy jsFiddle będzie pomocny. Podejrzewam, że nie inicjujesz aplikacji za pomocą modułu „productServices” . Dałby ten sam błąd, widzimy to w innym jsFiddle: http://jsfiddle.net/a69nX/1/
Jeśli planujesz pracować z AngularJS i MongoLab , sugerowałbym użycie istniejącego adaptera dla zasobu $ i MongoLab : https://github.com/pkozlowski-opensource/angularjs-mongolab Zmniejsza wiele bólu podczas pracy z MongoLab, można zobaczyć to w akcji tutaj: http://jsfiddle.net/pkozlowski_opensource/DP4Rh/ Disclaimer! Utrzymuję ten adapter (napisany na podstawie przykładów AngularJS), więc jestem tutaj oczywiście stronniczy.
źródło
<body ng-app="productServices">
a drugi ma<body ng-app="">
.Fiddle Options
zakładką po prawejOtrzymałem ten błąd, ponieważ przekazywałem nieprawidłowy parametr do definicji fabrycznej. Miałem:
Zadziałało, gdy usunąłem
$scope
i zmieniłem definicję fabryki na:W przypadku konieczności wstrzyknięcia
$scope
użyj:źródło
Właśnie miałem podobny problem. Błąd powiedział to samo w pytaniu, próbowałem go rozwiązać za pomocą odpowiedzi pkozlowski.opensource i Ben G, które są poprawne i dobre.
Mój problem był rzeczywiście inny z tym samym błędem:
w moim kodzie HTML miałem taką inicjalizację ...
Nieco dalej próbowałem zrobić coś takiego:
Pozbyłem się pierwszego ... wtedy zadziałało ... oczywiście nie możesz inicjalizować ng-app dwa lub więcej razy. Słusznie.
Całkowicie zapomniałem o pierwszej "ng-aplikacji" i byłem totalnie sfrustrowany. Może to kiedyś komuś pomoże ...
źródło
Upewnij się, że twój main
app.js
zawiera usługi, od których zależy. Na przykład:źródło
productServices
powinien to być moduł, więc nie ma znaczenia, co jest w środku takiego modułu (usługi czy nie).odpowiedź pkozłowskiego jest poprawna, ale na wypadek, gdyby zdarzyło się to komuś innemu, miałem ten sam błąd po dwukrotnym utworzeniu tego samego modułu przez pomyłkę; druga definicja unieważnia dostawcę pierwszej:
Stworzyłem moduł wykonując
potem nieco dalej w tym samym pliku:
Prawidłowy sposób to:
źródło
W moim przypadku zdefiniowałem nowego dostawcę, powiedzmy
xyz
Kiedy miałeś skonfigurować powyższego dostawcę, musisz wstrzyknąć go z
Provider
dołączonym ciągiem ->xyz
staje sięxyzProvider
.Dawny:
Jeśli wstrzykniesz powyższego dostawcę bez ciągu „Provider”, otrzymasz podobny błąd w OP.
źródło
Na końcu pliku JS, aby zamknąć funkcję fabryczną, którą miałem
});
zamiast
}());
źródło
})();
Wytropienie tego zajęło mi zbyt dużo czasu. Upewnij się, że minimalizujesz bezpieczeństwo kontrolera w ramach dyrektywy.
Mam nadzieję, że to pomoże
źródło
Aby dodać tutaj własne doświadczenie, próbowałem wstrzyknąć usługę do jednej z moich funkcji konfiguracyjnych modułu. Ten akapit z dokumentów, które w końcu znalazłem, wyjaśnia, dlaczego to nie działa:
Oznacza to, że możesz wstrzyknąć dostawców do funkcji module.config (...), ale nie możesz wstrzyknąć usług, w tym celu musisz poczekać, aż module.run (...), lub ujawnić dostawcę, którego możesz wstrzyknąć do modułu. config
źródło
U mnie ten błąd był spowodowany uruchomieniem zminimalizowanej wersji mojej aplikacji kątowej. Doktorzy Angular sugerują sposób obejścia tego problemu. Oto odpowiedni cytat opisujący problem, a sugerowane rozwiązanie można znaleźć w samych dokumentach tutaj :
źródło
Ponieważ jest to obecnie najwyższy wynik dla „nieznanego dostawcy angularjs” w Google, oto kolejny problem. Wykonując testy jednostkowe z Jasmine, upewnij się, że masz w
beforeEach()
funkcji następującą instrukcję :W przeciwnym razie w testach wystąpi ten sam błąd.
źródło
Jeszcze inny przypadek, w którym wystąpi ten błąd, jeśli Twoja usługa jest zdefiniowana w oddzielnym pliku javascript, upewnij się, że odwołujesz się do niego! Tak, wiem, błąd debiutanta.
źródło
Zapomniałem wstrzyknąć plik, który całkowicie zawierał moje usługi. Pamiętaj, aby zrobić to podczas inicjowania modułu aplikacji:
źródło
W moim przypadku użyłem anonimowej funkcji jako otoki dla modułu kątowego, na przykład:
Po zamknięciu nawiasów zapomniałem wywołać funkcję anonimową, otwierając i ponownie zamykając nawiasy, jak powyżej.
źródło
Dla mnie problemem było leniwe ładowanie; Późno załadowałem kontroler i usługę, więc nie były one dostępne podczas ładowania strony (i inicjalizacji Angular). Zrobiłem to z tagiem ui-if, ale to nie ma znaczenia. Rozwiązaniem było załadowanie usługi już z załadowaną stroną.
źródło
Oto kolejny możliwy scenariusz, w którym można zobaczyć ten błąd:
Jeśli używasz Sublime Text 2 i wtyczki kątowej, wygeneruje ona takie kody pośredniczące
zwróć uwagę na pusty „” jako pierwszy element tablicy po ciągu „utilFactory”. Jeśli nie masz żadnych zależności, usuń to, aby wyglądało tak:
źródło
Ponieważ to pytanie jest najlepszym wynikiem w Google, dodam do listy kolejną możliwą rzecz.
Jeśli moduł, którego używasz, ma błąd w otoce iniekcji zależności, zapewni ten sam wynik. Na przykład moduły kopiowania i wklejania z Internetu mogą polegać na underscore.js i próbować wstrzyknąć znak „_” w opakowaniu di. Jeśli podkreślenie nie istnieje w dostawcach zależności projektu, gdy kontroler spróbuje odwołać się do fabryki modułu, otrzyma „nieznanego dostawcę” dla fabryki w dzienniku konsoli przeglądarki.
źródło
Problem polegał na tym, że utworzyłem kilka nowych plików javascript, które odwoływały się do usługi, ale Chrome widział tylko starszą wersję. CTRL + F5 naprawił to za mnie.
źródło
Podczas kompilowania projektu za pomocą Grunt wystąpił błąd „nieznanego dostawcy” związany z makietami kątowymi (ngMockE2E). Problem polegał na tym, że makiety kątowe nie mogły zostać zminimalizowane, więc musiałem usunąć je z listy zminimalizowanych plików.
źródło
Po rozwiązaniu tego błędu również mogę wesprzeć tę listę odpowiedzi w mojej własnej sprawie.
Jest to jednocześnie proste i głupie (może nie głupie dla początkujących jak ja, ale tak dla ekspertów), odniesienie do skryptu angular.min.js musi być pierwszym na liście skryptów na stronie html.
To działa:
To nie:
Uwaga dotycząca pliku angular.min.js.
Mam nadzieję, że to pomoże każdemu! :)
źródło
Mój problem dotyczył Yeoman, używając (pisane wielkimi literami):
Wykonane pliki (bez wielkich liter):
ale dołączony plik index.html (pisany wielkimi literami):
Mam nadzieję, że to komuś pomoże.
źródło
Jeszcze inna możliwość.
Miałem
unknown Provider <- <- nameOfMyService
. Błąd został spowodowany następującą składnią:Angular szukał
''
zależności.źródło
Mój scenariusz może być trochę niejasny, ale może powodować ten sam błąd i ktoś może go doświadczyć, więc:
Podczas korzystania z usługi $ controller do tworzenia instancji nowego kontrolera (który oczekiwał „$ scope” jako pierwszego wstrzykniętego argumentu) przekazywałem lokalny zakres nowego kontrolera do drugiego parametru funkcji $ controller (). To doprowadziło do tego, że Angular próbował wywołać usługę $ scope, która nie istnieje ( chociaż przez chwilę myślałem, że w jakiś sposób usunę usługę '$ scope' z pamięci podręcznej Angulara ). Rozwiązaniem jest zawinięcie zakresu lokalnego w obiekt lokalny:
źródło
Żadna z powyższych odpowiedzi nie zadziałała dla mnie, może robiłem zupełnie źle, ale jako początkujący tak właśnie robimy.
Inicjalizowałem kontroler
div
w celu uzyskania listy:A następnie użycie
$routeProvider
do mapowania adresu URL na ten sam kontroler. Jak tylko zdjąłemng-init
kontroler działał z trasą.źródło
Miałem ten sam problem. Naprawiłem to używając
$('body').attr("ng-app", 'MyApp')
zamiast<body ng-app="MyApp">
Boostrap.Ponieważ to zrobiłem
do wymagań architektonicznych.
źródło
W mojej aplikacji Ruby on Rails wykonałem następujące czynności:
Zrobiono to w środowisku „programistycznym”, które zminimalizowało Angular.js i włączyło go do
/public/assets/application.js
pliku.Usunięcie
/public/assets/*
plików rozwiązało problem za mnie.źródło
Zmierzyłem się dzisiaj z podobnym problemem i problemy były naprawdę bardzo małe
Jeśli zauważysz powyższy blok, w pierwszym wierszu zauważysz, że przez pomyłkę wstrzyknąłem $ scope, co jest niepoprawne. Usunąłem tę niechcianą zależność, aby rozwiązać problem.
źródło
Miałem ten błąd po utworzeniu nowej fabryki i zastosowaniu jej w komponencie, ale nie sprawdziłem specyfikacji tych komponentów
źródło
Kolejna „łapanka”: otrzymywałem ten błąd podczas wstrzykiwania $ timeout i zajęło mi kilka minut, zanim zdałem sobie sprawę, że w wartościach tablicy mam białe znaki. To nie zadziała:
Publikowanie na wypadek, gdyby ktoś inny miał taki głupi błąd.
źródło
Mój przypadek był podejrzany
funkcja ma „c”!
źródło