कोणीय जेएस अज्ञात प्रदाता


152

मैं अपने स्वयं के 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;
    }]);

यह त्रुटि इंगित करती है कि कोणीय उत्पाद कारखाने के बारे में नहीं जानता है, सुनिश्चित करें कि इस सेवा के लिए जेएस पहले संदर्भ है। मॉड्यूल की घोषणा करते समय भी निर्भरता को स्पष्ट रूप से परिभाषित करना सुनिश्चित करें क्योंकि जब फ़ाइलों को कम से कम किया जाता है तो यह त्रुटि नाम की गड़बड़ी के कारण भी सामने आएगी। अधिक जानकारी के लिए, इस लेख को देखें :: ozkary.com/2015/11/…
ozkary

जवाबों:


130

आपका कोड अच्छा लग रहा है, वास्तव में यह काम करता है (खुद कॉल के अलावा) जब कॉपी किया जाता है और एक नमूना jsField में चिपकाया जाता है: http://jsfiddle.net/VGaWD/

यह कहना मुश्किल है कि अधिक पूर्ण उदाहरण देखे बिना क्या चल रहा है, लेकिन मुझे उम्मीद है कि उपरोक्त jsFiddle मददगार होगी। मुझे जो संदेह हो रहा है, वह यह है कि आप अपने ऐप को 'प्रोडक्ट सर्विसेज' मॉड्यूल के साथ शुरू नहीं कर रहे हैं । यह एक ही त्रुटि देगा, हम इसे दूसरे jsFiddle में देख सकते हैं: http://jsfiddle.net/a69nX/1/

यदि आप AngularJS और MongoLab के साथ काम करने की योजना बना रहे हैं, तो मैं $ संसाधन और MongoLab के लिए एक मौजूदा एडेप्टर का उपयोग करने का सुझाव दूंगा : https://github.com/pkozlowski-opensource/angularjs-mongbab यह MongoLab के साथ काम करने में बहुत दर्द को कम करता है, आप इसे यहां कार्रवाई में देख सकते हैं: http://jsfiddle.net/pkozlowski_opensource/DP4Rh/ अस्वीकरण! मैं इस एडेप्टर को बनाए रख रहा हूं (AngularJS उदाहरणों पर आधारित) इसलिए मैं स्पष्ट रूप से यहाँ पक्षपाती हूं।


मुझे भी यही समस्या है और इससे मेरा मसला हल नहीं हुआ। मुझे वास्तव में डेटा वापस मिल गया है ... इस त्रुटि संदेश को छोड़कर आपको लगता है कि सब कुछ ठीक काम कर रहा था। हालांकि, मैं बॉडी एलिमेंट में एनजी ऐप का इस्तेमाल नहीं कर रहा हूं, मैं बूटस्ट्रैप कर रहा हूं जैसे: एंगुलर.लीमेंट (डॉक्यूमेंट)। पहले से ही (फंक्शन () {एंगुलर.बूटस्ट्रैप (डॉक्यूमेंट, ['रिपोर्टसर्विस]];});
टॉम

17
हाय दोस्तों, यह थोड़ा शर्मनाक है। मुझे भी ठीक यही समस्या है। लेकिन मैं 2 jsFiddles के बीच अंतर नहीं कर सकता। जहां पर देखने के लिए कोई संकेत अत्यधिक सराहना की है।
schacki

4
@schacki, पहेलियों में अंतर जानकारी टैब में पाया जा सकता है। उनमें से एक के पास एक शरीर है <body ng-app="productServices">और दूसरे के पास है <body ng-app="">
विनीत रेनॉल्ड्स

और जानकारी टैब कहां है? :)
Aleks

3
लगता है कि सूचना टैब अब Fiddle Optionsदाईं ओर टैब है
गैंगस्टीड

40

मुझे वह त्रुटि मिली क्योंकि मैं कारखाने की परिभाषा के लिए एक गलत पैरामीटर पारित कर रहा था। मैं था:

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

जब मैंने हटाया $scopeऔर कारखाने की परिभाषा को बदल दिया तो यह काम किया :

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

यदि आपको इंजेक्शन लगाने $scope, उपयोग करने की आवश्यकता होती है :

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

32

मुझे भी इसी तरह की समस्या थी। त्रुटि ने प्रश्न में वही कहा, जो pkozlowski.opensource और बेन जी के उत्तर के साथ हल करने की कोशिश की, जो दोनों सही और अच्छे उत्तर हैं।

मेरी समस्या वास्तव में एक ही त्रुटि के साथ अलग थी:

मेरे एचटीएमएल-कोड में मुझे इस तरह की प्रारंभिक जानकारी थी ...

<html ng-app>

थोड़ा और नीचे मैंने ऐसा कुछ करने की कोशिश की:

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

मैं पहले एक से छुटकारा पा गया ... फिर काम किया ... जाहिर है कि आप एनजी ऐप को दो बार या उससे अधिक बार इनिशियलाइज़ नहीं कर सकते। काफी उचित।

मैं टोटल "एनजी-ऐप" के बारे में भूल गया और टोटल निराश हो गया। शायद यह किसी को मदद करने वाला है ...


2
मेरे पास एक समान मुद्दा था, लेकिन मेरे मामले में div में निर्दिष्ट एनजी-कंट्रोलर एक नियंत्रक के लिए अपराधी था जो सेवा का संदर्भ देता है। ऐसा लगता है कि एंगुलर को यह नहीं पता था कि जब यह दृश्य पार्स हो जाता है तो सेवा को कैसे हल किया जाए।
हेक्टर कोरी

25

सुनिश्चित करें कि आपके मुख्य app.jsमें वे सेवाएं शामिल हैं जिन पर यह निर्भर करता है। उदाहरण के लिए:

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

1
यदि मैं गलत नहीं हूं productServices, तो ऐसे मामले में एक मॉड्यूल होना चाहिए, इसलिए यह अप्रासंगिक है कि ऐसे मॉड्यूल (सेवाओं या नहीं) के अंदर क्या है।
ग्रीनोल्डमैन

17

pkozlowski का उत्तर सही है, लेकिन अगर किसी और के साथ ऐसा होता है, तो गलती से एक ही मॉड्यूल को दो बार बनाने के बाद मुझे वही त्रुटि हुई; दूसरी परिभाषा पहले प्रदाता को ओवरराइड कर रही थी:

मैंने मॉड्यूल बनाकर किया

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

फिर उसी फ़ाइल में थोड़ा और नीचे:

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

ऐसा करने का सही तरीका है:

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

11

मेरे मामले में, मैंने एक नया प्रदाता परिभाषित किया है, कहते हैं, xyz

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

जब आप उपरोक्त प्रदाता को कॉन्फ़िगर करने के लिए थे, तो आप इसे Providerस्ट्रिंग के साथ इंजेक्ट करना चाहते हैं -> xyzबन जाता है xyzProvider

उदाहरण के लिए:

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

यदि आप उपरोक्त प्रदाता को 'प्रदाता' स्ट्रिंग के बिना इंजेक्ट करते हैं, तो आपको ओपी में समान त्रुटि मिलेगी।


8

फैक्ट्री फंक्शन को बंद करने के लिए जेएस फाइल के अंत में

});

के बजाय

}());


1
मेरी परियोजना के लिए हम आमतौर पर उपयोग करते हैं})();
mrOak

5

इसने मुझे नीचे ट्रैक करने के लिए बहुत लंबा रास्ता तय किया। सुनिश्चित करें कि आप अपने निर्देश के भीतर अपने नियंत्रक को छोटा कर लें।

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

  return {

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

    }]
  }
}

उम्मीद है की वो मदद करदे


5

यहां अपना खुद का अनुभव जोड़ने के लिए, मैं अपने एक मॉड्यूल कॉन्फ़िगरेशन फ़ंक्शन में एक सेवा को इंजेक्ट करने की कोशिश कर रहा था। डॉक्स से यह पैराग्राफ जो मैंने अंततः पाया कि क्यों काम नहीं करता है:

एप्लिकेशन बूटस्ट्रैप के दौरान, एंगुलर सभी सेवाओं को बनाने से पहले बंद हो जाता है, यह सभी प्रदाताओं को कॉन्फ़िगर और इंस्टेंट करता है। हम इसे एप्लिकेशन जीवन-चक्र का कॉन्फ़िगरेशन चरण कहते हैं। इस चरण के दौरान, सेवाएं सुलभ नहीं हैं क्योंकि वे अभी तक बनाई नहीं गई हैं।

मतलब आप प्रदाताओं को मॉड्यूल.config (...) कार्यों में इंजेक्ट कर सकते हैं, लेकिन आप सेवाओं को इंजेक्ट नहीं कर सकते, इसके लिए आपको मॉड्यूल.run (...) तक इंतजार करना होगा, या एक प्रदाता को उजागर करना होगा जिसे आप मॉड्यूल पर इंजेक्ट कर सकते हैं। config


4

मेरे लिए, यह त्रुटि मेरे कोणीय ऐप के लघु संस्करण को चलाने के कारण हुई थी। कोणीय डॉक्स इसके चारों ओर काम करने का एक तरीका सुझाते हैं। यहाँ इस मुद्दे का वर्णन करते हुए प्रासंगिक उद्धरण दिया गया है, और आप डॉक्स में सुझाए गए समाधान को स्वयं यहाँ पा सकते हैं :

Minular पर एक नोट चूंकि Angular कंट्रोलर के कंस्ट्रक्टर फ़ंक्शन के लिए तर्कों के नाम से नियंत्रक की निर्भरता को कम करता है, यदि आप PhoneListCtrl कंट्रोलर के लिए जावास्क्रिप्ट कोड को छोटा करना चाहते थे, तो इसके सभी फ़ंक्शन तर्क भी न्यूनतम होंगे, और निर्भरता इंजेक्टर नहीं होगा सेवाओं की सही पहचान करने में सक्षम हो।


3

चूंकि यह Google पर अभी "angularjs अज्ञात प्रदाता" के लिए शीर्ष परिणाम है, इसलिए यहां एक और गोचा है। जैस्मीन के साथ इकाई परीक्षण करते समय, सुनिश्चित करें कि आपके beforeEach()कार्य में यह विवरण है :

module('moduleName'); 

अन्यथा आपको अपने परीक्षणों में यही त्रुटि मिलेगी।


3

फिर भी एक और मामला जहां यह त्रुटि होगी, यदि आप सेवा करते हैं एक अलग जावास्क्रिप्ट फ़ाइल में परिभाषित किया गया है, तो सुनिश्चित करें कि आप इसे संदर्भित करते हैं! हाँ, मुझे पता है, धोखेबाज़ गलती।


2

मैं उस फ़ाइल को इंजेक्ट करना भूल गया था जिसने मेरी सेवाओं को पूरी तरह से रोक दिया था। अपने एप्लिकेशन मॉड्यूल को प्रारंभ करते समय ऐसा करना याद रखें:

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

2

मेरे मामले में, मैंने कोणीय मॉड्यूल के लिए एक आवरण के रूप में एक अनाम फ़ंक्शन का उपयोग किया, जैसे:

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

कोष्ठक को बंद करने के बाद, मैं फिर से ऊपर के रूप में कोष्ठक को खोलना और बंद करके अनाम फ़ंक्शन को कॉल करना भूल गया।


मुझे पता है कि आपने 4 साल पहले इसका जवाब दिया था, लेकिन इसने आज मेरी मदद की, धन्यवाद।
लेगोलस

1

मेरे लिए समस्या आलसी लोडिंग थी; मैंने अपने नियंत्रक और सेवा को देर से लोड किया, इसलिए वे पृष्ठ लोड (और कोणीय आरंभीकरण) पर उपलब्ध नहीं थे। मैंने ऐसा एक ui-if टैग के साथ किया, लेकिन यह अप्रासंगिक है। समाधान पृष्ठ लोड के साथ सेवा को पहले ही लोड करना था।


1

यहाँ एक और संभावित परिदृश्य है जहाँ आप इस त्रुटि को देख सकते हैं:

यदि आप Sublime Text 2 और कोणीय प्लगइन का उपयोग करते हैं, तो यह इस तरह से स्टब्स उत्पन्न करेगा

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

        }
    }
]);

खाली '' को 'उपयोगी' स्ट्रिंग के बाद सरणी के पहले तत्व के रूप में देखें। यदि आपके पास कोई निर्भरता नहीं है, तो इसे हटा दें ताकि यह इस तरह हो:

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

        }
    }
]);

1

चूंकि यह प्रश्न शीर्ष Google परिणाम है, इसलिए मैं सूची में एक और संभावित चीज जोड़ूंगा।

यदि आप जिस मॉड्यूल का उपयोग कर रहे हैं, वह निर्भरता इंजेक्शन आवरण पर विफलता है, तो यह वही परिणाम प्रदान करेगा। उदाहरण के लिए इंटरनेट से कॉपी और पेस्ट मॉड्यूल, अंडरस्कोर.जेएस पर भरोसा कर सकते हैं और डि रैपर में '_' के साथ इंजेक्ट करने का प्रयास कर सकते हैं। यदि अंडरस्कोर आपके प्रोजेक्ट निर्भरता प्रदाताओं में मौजूद नहीं है, जब आपका नियंत्रक आपके मॉड्यूल के कारखाने को संदर्भित करने का प्रयास करता है, तो उसे ब्राउज़र के कंसोल लॉग में आपके कारखाने के लिए 'अज्ञात प्रदाता' मिलेगा।


1

मेरे लिए समस्या यह थी कि मेरे द्वारा बनाई गई कुछ नई जावास्क्रिप्ट फाइलें थीं, जिन्होंने सेवा को संदर्भित किया था फिर भी क्रोम ने केवल पुराने संस्करण को देखा। एक CTRL + F5 ने इसे मेरे लिए तय किया।


0

ग्रंट के साथ अपने प्रोजेक्ट को संकलित करते समय मुझे कोणीय-मोक्स (ngMockE2E) से संबंधित "अज्ञात प्रदाता" त्रुटि मिली। समस्या यह थी कि कोणीय-मोक्स को छोटा नहीं किया जा सकता है इसलिए मुझे इसे कीमाधारित फाइलों की सूची से हटाना पड़ा।


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>

कोणीय के बारे में सूचना। Min.js

आशा है कि यह किसी की मदद करता है !! :)


0

मेरी समस्या येओमान के साथ थी, (पूंजीकृत) का उपयोग करके:

yo angular:factory Test

निर्मित फ़ाइलें (अनकैपिटल):

app/scripts/services/test.js

लेकिन index.html फ़ाइल में शामिल (पूंजीकृत):

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

आशा है कि यह किसी की मदद करता है।


0

फिर भी एक और संभावना।

मेरे पास था unknown Provider <- <- nameOfMyService। निम्न सिंटैक्स के कारण त्रुटि हुई थी:

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

कोणीय ''निर्भरता की तलाश में था ।


त्रुटि: [$ इंजेक्टर: अनप्र] अज्ञात प्रदाता: LoginFactoryProvider <- LoginFactory मैं इसे एक कर रहा हूं, तो मैं इसे कैसे ठीक कर सकता हूं
NinjaXnado

0

मेरा परिदृश्य थोड़ा अस्पष्ट हो सकता है लेकिन यह उसी त्रुटि का कारण बन सकता है और कोई व्यक्ति इसका अनुभव कर सकता है, इसलिए:

जब एक नए नियंत्रक (जो पहले इंजेक्शन के तर्क के रूप में '$ गुंजाइश' की उम्मीद कर रहा था) को इंस्टेंट करने के लिए $ नियंत्रक सेवा का उपयोग कर रहा हूं तो मैं नए नियंत्रक के स्थानीय गुंजाइश को $ नियंत्रक () फ़ंक्शन के दूसरे पैरामीटर में पास कर रहा था। इससे एंगुलर एक $ स्कोप सेवा शुरू करने की कोशिश कर रहा है, जो मौजूद नहीं है ( हालांकि, थोड़ी देर के लिए, मुझे वास्तव में लगा कि मैं कुछ इस तरह से एंगुलर के कैश से '$ स्कोप' सेवा को हटा दूंगा )। इसका समाधान स्थानीय वस्तु को स्थानीय वस्तु में लपेटना है:

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

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

0

ऊपर दिए गए किसी भी उत्तर ने मेरे लिए काम नहीं किया, शायद मैं पूरी तरह से गलत कर रहा था, लेकिन एक शुरुआत के रूप में हम यही करते हैं।

मैं divएक सूची के क्रम में नियंत्रक को इनिशियलाइज़ कर रहा था :

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

और फिर $routeProviderउसी नियंत्रक के लिए एक URL को मैप करने के लिए उपयोग करना। जैसे ही मैंने हटाया ng-initनियंत्रक ने मार्ग के साथ काम किया।


0

मुझे भी यही समस्या थी। मैंने तय किया कि बूस्टैप के $('body').attr("ng-app", 'MyApp')बजाय उपयोग करना <body ng-app="MyApp">

क्योंकि मैंने किया

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

वास्तुकला आवश्यकताओं के लिए।


0

मेरे रूबी ऑन रेल्स ऐप में, मैंने निम्नलिखित कार्य किया था:

rake assets:precompile

यह 'विकास' के माहौल में किया गया था, जिसने Angular.js को छोटा किया था और इसे /public/assets/application.jsफ़ाइल में शामिल किया था ।

/public/assets/*फाइलों को हटाने से मेरे लिए समस्या हल हो गई।


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

यदि आप उपरोक्त ब्लॉक का निरीक्षण करते हैं, तो पहली पंक्ति में आप देखेंगे कि मैंने गलती से $ स्कोप इंजेक्ट किया है जो गलत है। मैंने मुद्दे को हल करने के लिए उस अवांछित निर्भरता को हटा दिया।

 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

एक नया कारखाना बनाने और एक घटक के भीतर उपयोग करने के बाद मुझे यह त्रुटि हुई थी लेकिन मैंने उस घटकों के चश्मे की जांच नहीं की

इसलिए यदि आपके (चश्मे) की विफलता फ़ाइलों का परीक्षण करती है

आपको जोड़ने की आवश्यकता है beforeEach(module('YouNewServiceModule'));


-1

एक और 'गेटा': मुझे यह त्रुटि $ टाइमआउट के इंजेक्शन के रूप में मिल रही थी, और मुझे यह महसूस करने में कुछ मिनट लगे कि मेरे पास ऐरे वैल्यूज़ में व्हॉट्सएप है। यह काम नहीं करेगा:

angular.module('myapp',[].
  controller('myCtrl', ['$scope', '$timeout ', 
    function ($scope, $timeout){
      //controller logic
    }
  ]);

बस कुछ और के मामले में पोस्टिंग इस तरह एक मूर्खतापूर्ण त्रुटि है।


-2

मेरा मामला टाइपिंग था

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

फंक्शन में एक 'c' होता है!

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.