2012-02-15 4 views
32

के साथ एकाधिक फ़ाइलें संचार जब मैं एक नई कॉफ़ीस्क्रिप्ट फ़ाइल बनाता हूं, तो मैं किसी अन्य फ़ाइल से संकलित कोड में कोड तक नहीं पहुंच सकता क्योंकि यह कुछ फ़ंक्शन स्कोप में लपेटा जाता है।कॉफ़ीस्क्रिप्ट

CoffeeScript:

class ChatService 
    constructor: (@io) -> 

जनरेट किया जावास्क्रिप्ट: उदाहरण के लिए

(function() { 
    var ChatService;  
    ChatService = (function() {  
    function ChatService(io) { 
     this.io = io; 
    }  
    return ChatService;  
    })();  
}).call(this); 

जब एक और फ़ाइल में ChatService कॉल करने के लिए कोशिश कर रहा है, यह परिभाषित नहीं है। मैं कॉफ़ीस्क्रिप्ट के साथ कई फाइलों को कैसे संभाल सकता हूं?

+0

यदि आप रेल का उपयोग कर रहे हैं, तो आपको यह सुनिश्चित करना होगा कि किसी भी निर्भर कॉफ़ीस्क्रिप्ट फ़ाइल को * पहले * आप कोशिश करें और संदर्भ दें। एक बार जब आप उन फ़ाइलों में "आवश्यकताएं" निर्देश सेट करते हैं जिन्हें वास्तव में दूसरों की आवश्यकता होती है, तो आपको चर आदि तक पहुंच प्राप्त होगी। –

उत्तर

56

इस पर निर्भर करता है कि यह क्लाइंट- या सर्वर-साइड कोड है, तो दो अलग-अलग दृष्टिकोण हैं।

क्लाइंट-साइड:

class window.ChatService 
    constructor: (@io) -> 

फिर एक और फाइल में, दोनों ChatService और window.ChatService वर्ग के लिए उपयोग की अनुमति देगा: यहाँ हम चीजें हैं जो वैश्विक नामस्थान (window) करने के लिए फ़ाइलों में उपलब्ध होना चाहिए इस प्रकार देते हैं ।


सर्वर साइड: यहाँ हम exports और require उपयोग करना चाहिए।

class exports.ChatService 
    constructor: (@io) -> 

फिर, अन्य फ़ाइल से इसे प्राप्त करने के लिए आप उपयोग कर सकते हैं: ChatService.coffee फ़ाइल में, आपको निम्न होता

ChatService = require('ChatService.coffee').ChatService 

नोट: अगर वहाँ कई वर्गों है कि आप से मिल रहा है कर रहे हैं

{ChatService, OtherService} = require('ChatService.coffee') 

: ChatService.coffee, यह एक ऐसी जगह है जहां CoffeeScript के dict वास्तव में खोल जैसे चमकता है, है

दोनों: मूल रूप से, हम यह चुनते हैं कि हम किस पर्यावरण के आधार पर सर्वर-साइड या क्लाइंट-साइड कोड चलाते हैं या नहीं।एक आम तरीका है यह करने के लिए:

class ChatService 
    constructor: (@io) -> 

if typeof module != "undefined" && module.exports 
    #On a server 
    exports.ChatService = ChatService 
else 
    #On a client 
    window.ChatService = ChatService 

इसे पाने के लिए:

if typeof module != "undefined" && module.exports 
    #On a server 
    ChatService = require("ChatService.coffee").ChatService 
else 
    #On a client 
    ChatService = window.ChatService 

दूसरे खंड की किसी और खंड छोड़ा जा सकता है, के बाद से पहले से ही ChatService संदर्भ window से जुड़ी को दर्शाता है।

आप इस फ़ाइल में कक्षाओं का एक बहुत परिभाषित करने के लिए जा रहे हैं, ऐसा लगता है कि उन्हें परिभाषित करने के लिए आसान हो सकता है: तो

self = {} 

class self.ChatService 

और उन्हें क्लाइंट पर सर्वर पर module.exports = self और _.extend(window, self) की तरह देते हैं (_.extend को extend फ़ंक्शन उचित के साथ प्रतिस्थापित करें)।

+1

चीजों के node.js पक्ष के लिए +1। –

+2

दोनों node.js और क्लाइंट साइड दृष्टिकोण देने के लिए धन्यवाद, मुझे दोनों की आवश्यकता थी। –

+0

"एमयू बहुत छोटा है" के उत्तर की तरह, आप एक निर्यात करने में सक्षम हो सकते हैं। App.ClassName भी। मुझे लगता है कि आप उस "नामस्थान" के ऐप हिस्से को कॉल कर सकते हैं। कृपया मुझे सुधारें अगर मैं गलत हूं। – Chris

23

सामान्य दृष्टिकोण window में एक वैश्विक नाम स्थान को परिभाषित करने के लिए है:

window.App = { } 

कि कुछ भी करने से पहले अपने आवेदन के प्रवर्तन कोड में कहीं जाना होगा और कुछ होता है। और फिर, अपने वर्ग के लिए:

class App.ChatService 
    constructor: (@io) -> 

आप के माध्यम से App कहीं भी आप चाहते हैं अपने वर्ग के संदर्भ के लिए और आप ग्लोबल नेमस्पेस को दूषित बारे में चिंता करने की जरूरत नहीं है की अनुमति देता है कि:

chatter = new App.ChatService 

यदि आप चाहते थे अपने ChatService को वास्तव में वैश्विक बनाने के लिए आप class window.ChatService का उपयोग कर सकते हैं, लेकिन मैं इसके खिलाफ अनुशंसा करता हूं कि अनुप्रयोगों के सबसे तुच्छ को छोड़कर।

AFAIK, node.js में window जैसा कुछ है लेकिन मैं आपको यह बताने के लिए node.js के साथ पर्याप्त परिचित नहीं हूं।

+1

नोड.जेएस में, आप उन्हें 'निर्यात' से जोड़कर प्रतीकों का निर्यात करते हैं। एक मॉड्यूल में: export.ChatService = ChatService; दूसरे में: ChatService = की आवश्यकता है ("./ chat")। ChatService। –

+0

@ लिनस: धन्यवाद, मुझे लगता है कि हारून डुफोर ने इसे कवर करने से पहले कवर किया था। –

0

अपने वर्गों को नामस्थानों से अलग करें और cake का उपयोग उन सभी को एक (या अधिक) परिणामी .js फ़ाइल में संकलित करने के लिए करें। केकफ़ाइल को कॉन्फ़िगरेशन के रूप में उपयोग किया जाता है जो आपके कॉफी स्क्रिप्ट को संकलित करने के क्रम में नियंत्रित करता है - बड़ी परियोजनाओं के साथ काफी आसान है।

केक, स्थापित करने के लिए काफी आसान है और सेटअप है vim से केक लागू आप अपने प्रोजेक्ट संपादन कर रहे हैं, जबकि फिर बस

:!cake build 

है और आप अपने ब्राउज़र को ताज़ा और परिणाम देख सकते हैं।

क्योंकि मैं फ़ाइलों को संरचित करने और रीढ़ की हड्डी और केक के संयोजन में कॉफ़ीस्क्रिप्ट का उपयोग करने का सबसे अच्छा तरीका सीखने में भी व्यस्त हूं, मैंने इसे अपने लिए संदर्भ के रूप में रखने के लिए small project on github बनाया है, शायद यह आपको भी मदद करेगा केक और कुछ बुनियादी चीजें। सभी संकलित फाइलें www फ़ोल्डर में हैं ताकि आप उन्हें अपने ब्राउज़र में खोल सकें और सभी स्रोत फ़ाइलों (केक कॉन्फ़िगरेशन को छोड़कर) src फ़ोल्डर में हैं। इस उदाहरण में, सभी .coffee फ़ाइलों को संकलित और एक आउटपुट .js फ़ाइल में जोड़ा गया है जिसे HTML में शामिल किया गया है।