2016-04-09 23 views
5

की 'जिज्ञासा' पढ़ा नहीं जा सकता मैं अपने आप को AngularJS के साथ परिचित कर रहा हूँ और एक वेब एपीआई बैकएंड को कॉल करते थे और मैंहो रही लेखन त्रुटि: गुण अपरिभाषित

angular.js:13424 TypeError: Cannot read property 'query' of undefined

की त्रुटि मिलती है मैं एक productListController

(function() 
{ 
"use strict"; 
angular.module("productManagement").controller("ProductListController", ["productResource", ProductListController]); 
function ProductListController($scope, productResource) { 

    productResource.query(function (data) { 
     $scope.products = data 
    }); 
} 
})(); 
है

और मैं एक सेवा productResource

(function() { 
"use strict"; 

angular.module("common.services").factory("productResource", ["$resource", "appSettings", productResource]) 

function productResource($resource, appSettings) { 
    return $resource(appSettings.serverPath + "/api/products/:id").query(); 
} 
}()); 

appSettings नामक एक निरंतर है जो एक पथ निर्दिष्ट करता है।

query क्यों अनिर्धारित है?

उत्तर

7

आपका नियंत्रक निम्नलिखित निर्भरता की उम्मीद है इंजेक्ट किया जा करने के लिए:

$scope, productResource 

और वास्तव में आप केवल "productResource" बजाय इंजेक्शन कर रहे हैं "$scope", "productResource"

आपका नियंत्रक इस तरह initialised किया जाना चाहिए:

angular.module("productManagement").controller("ProductListController", ["$scope", "productResource", ProductListController]); 

function ProductListController($scope, productResource) { 
    // ... 
} 

नियंत्रण में पैरामीटर के साथ समन्वयित होने की आवश्यकता में निर्भर निर्भरताओं के नाम एर फ़ंक्शन घोषणा - इस समय जब आप "productResource" इंजेक्शन कर रहे हैं तो यह $scope पैरामीटर में जा रहा है।

+0

यह सब समझ में आता है। धन्यवाद – Arianule

1

मुझे कुछ समय पहले यह समस्या थी और मुझे इसे समझने में घंटों लग गए।

कुछ मामलों में आपको यह सुनिश्चित करने की आवश्यकता है कि आप "productResource" और "$scope" इंजेक्ट करें और एक विशिष्ट ऑर्डर का पालन करें। मुझे समझें:

angular.module("productManagement").controller("ProductListController", ["$scope", "productResource", ProductListController]); 

    function ProductListController($scope, productResource) { 
     // ... 
    } 

ऊपर कोड हमेशा काम करेंगे, लेकिन अगर तुम पदों के लिए स्विच के रूप में नीचे देखा कुछ मामलों में, (जैसा कि मैंने ऊपर कहा गया है), यह काम नहीं करेगा।

angular.module("productManagement").controller("ProductListController", ["productResource","$scope", ProductListController]); 

    function ProductListController($scope, productResource) { 
     // ... 
    } 

मुझे यह सुनिश्चित करने का यह मुद्दा कभी नहीं था कि निर्भरता आज तक सही क्रम में इंजेक्शन दी गई हो। यदि यह सब के बाद आपका कोड अभी भी काम नहीं कर रहा है तो समस्या शायद कहीं और है।
मुझे उम्मीद है कि इससे मदद मिलती है।

संबंधित मुद्दे