2012-08-16 16 views
39

के माध्यम से पारित किया जा रहा है, मैं अपने वेब ऐप में जावास्क्रिप्ट लोड करने के लिए Requirejs का उपयोग कर रहा हूं। समस्या यह है कि मुझे undefined ऑब्जेक्ट को मॉड्यूल में पास किया जा रहा है, जो कि अन्य मॉड्यूल में उपयोग किए जाने पर पूरी तरह से ठीक हो जाता है।अनिवार्य वस्तु को Requjs

ठीक है, यहां सेटअप है। मेरे main.js फ़ाइल जो requirejs स्टार्टअप पर चलाता है:

require.config({ 
    baseUrl: "/scripts", 
    paths: { 
     demographics: "Demographics/demographics", 
     complaints: "Complaints/complaints", 
    } 
}); 

require(["templates", "demographics", "complaints", "crossDomain"], function (templates, demographics, complaints) { 
    "use strict"; 

    console.log("0"); 
    console.log(demographics === undefined); 

    demographics.View.display(); 
}); 

config का एक बहुत इस समस्या में सिर्फ कोर फ़ाइलों को छीन लिया गया है।

यहाँ Demographics.js है:

define(["ko", "templates", "complaints", "globals", "underscore"], function (ko, templates, complaints, globals) { 

    // Stuff removed. 
    return { 
     View: view 
    }; 
}); 

और Complaints.js

define([ 
    "demographics", 
    "ko", 
    "templates", 
    "complaints", 
    "visualeffects", 
    "globals", 
    "webservice", 
    "underscore", 
    "typewatcher", 
    "imagesloaded"], 
    function (demographics, ko, templates, complaints, visualeffects, globals, webservice) { 
     "use strict"; 


     console.log("1"); 
     console.log(demographics === undefined); 
    return { 
     View: view 
    }; 
}); 

समस्या यह है - Complaints.js में demographics पैरामीटर define config के माध्यम से पारित कर दिया undefined है। कंसोल लॉग आउट मुझे बताता है कि "जनसांख्यिकी === अपरिभाषित" true है।

हालांकि, जब main.js फ़ाइल निष्पादित होती है, तो इसे पारित जनसांख्यिकीय पैरामीटर अनिर्धारित नहीं होता है, यह अपेक्षाकृत एक त्वरित वस्तु है।

अब मैं अटक गया हूं क्योंकि मैं नहीं देख सकता कि क्यों complaints.js में जनसांख्यिकीय चर अपरिभाषित है। क्या कोई मुझे बता सकता है कि मुझे क्या याद आ रहा है?

उत्तर

56

आपके पास एक परिपत्र निर्भरता है। demographics मॉड्यूल complaints और complaints पर निर्भर करता है demographics पर निर्भर करता है। documentation के अनुसार:

आप एक सर्कुलर निर्भरता को परिभाषित (एक की जरूरत है ख और ख एक की जरूरत है), तो इस मामले में जब ख के मॉड्यूल समारोह कहा जाता है, यह एक के लिए एक अपरिभाषित मूल्य मिल जाएगा।

समाधान, यदि आप एक सर्कुलर निर्भरता नहीं निकाल सकते एसिंक्रोनस मांग पर अन्य के भीतर दो मॉड्यूल में से एक की आवश्यकता होती है (जैसे कि जब दृश्य के बजाय जब मॉड्यूल दृश्य से तय होता है कि है की instantiated है निष्पादित)। दोबारा, docs इस विषय को काफी अच्छी तरह से कवर करता है।

+0

आह, बिल्कुल मुझे क्या संदेह था, लेकिन वास्तव में ऐसा नहीं लगता था कि यह हो सकता है (मैं इस एएमडी/requjs सामान के साथ एक असली नौसिखिया हूँ :) कार्रवाई की मेरी योजना एक और मॉड्यूल बनाना है जो दोनों के लिए कोड होस्ट करेगा जनसांख्यिकी और शिकायतें। इसका मतलब है कि इस नए मॉड्यूल का इस्तेमाल कोड को अन्य दो फाइलों से कॉल करने के लिए किया जाएगा। मेरे विचारों की पुष्टि करने के लिए धन्यवाद। जब मुझे समय मिल जाए तो यह कोशिश करेगा। –

26

एक और मामला तब होता है जब आप मॉड्यूल को परिभाषित करते समय define के बजाय गलती से require टाइप करते हैं, तो मुझे यह ध्यान देने में कुछ समय लगा।

11

मुझे एक ही समस्या थी। मेरे मामले में, जब एक मॉड्यूल को परिभाषित करने, मैं लिखा था:

define('some_dependency', ... 

बजाय

define(['some_dependency'], ... 
4

एक अन्य संभावित कारण मॉड्यूल के इंटरफेस (एएमडी, CommonJS) लागू कर रहा है, लेकिन कुछ भी वापस करना भूल जाना। मैंने बस ऐसा किया।

0

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

define(function() { 
    return {}; 
}()); // <-- notice the '()' typo. 

यह "टाइपो" इस एक के लिए कोई जे एस त्रुटियों का कारण बनता है और यह भ्रामक विशेष रूप से कई संभावित परिपत्र dependancies के साथ एक जटिल आवेदन में यह पता लगाने के लिए कर सकते हैं:

-1

मैं सिर्फ एक और कारण का सामना करना पड़ा।

कारण, ज़ाहिर है, "टाइपो" वैध जेएस है जो केवल उस फ़ंक्शन को कॉल करता है जिसे आप परिभाषित करते हैं जिससे इसके परिणाम define() पर इसके परिणामस्वरूप कार्य हो जाते हैं।