2012-02-13 17 views
21

मैं कॉफीस्क्रिप्ट के साथ रेल 3.1 का उपयोग कर रहा हूं और एक झटके में भाग गया हूं। मैं .js..cb फ़ाइल में स्थित .js.erb फ़ाइल से फ़ंक्शन कैसे कॉल करूं?रेल - जावास्क्रिप्ट से कॉफीस्क्रिप्ट को कॉल करना

कहो .js.coffee में समारोह निम्नलिखित है:

myName = -> "Bob" 

मैं मैं सिर्फ इस तरह के रूप में किसी भी नियमित js समारोह की तरह यह कह सकते हैं लगता होगा:

var theName = myName(); 

लेकिन यह है कि 'नहीं करता है टी काम करने लगते हैं। कोई विचार?

या क्या सब कुछ एक ही बनाने के लिए मेरी .js.erb फ़ाइल में कॉफ़ीस्क्रिप्ट का उपयोग करना संभव है?

+2

आपको वास्तव में फ्लैम्बिनो के उत्तर को स्वीकार करना चाहिए। यह बहुत अच्छा है! –

उत्तर

54

कारण आप कॉफीस्क्रिप्ट फ़ंक्शन को सीधे कॉल नहीं कर सकते हैं, यह है कि संकलित होने पर कॉफीस्क्रिप्ट तुरंत-लागू फ़ंक्शन में लपेटा जाता है। यह आपके कोड को वैश्विक नेमस्पेस प्रदूषित करने से रोकने के लिए किया जाता है।

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

window.myName = -> "Bob" 

इस तरह, समारोह वैश्विक विस्तार के लिए सीधे जोड़ा जाता है, और आप से यह कॉल कर सकते हैं कहीं भी window.myName() (या बस myName() के रूप में जब तक कि फ़ंक्शन को स्थानीय द्वारा छायांकित नहीं किया जाता)।

हालांकि, ग्लोबल नेम स्पेस के रूप में के रूप में स्वच्छ रखने के लिए संभव है, यह अपने आप के लिए एक नाम स्थान को परिभाषित करने (जैसे jQuery करता है, $ वस्तु में सब कुछ रख कर) सबसे अच्छा है। उदाहरण के लिए, अपने पहले CoffeeScript या JavaScript फ़ाइल (यानी पहली फ़ाइल लोड करने के लिए) में, तो आप इस

window.myNamespace = {}; 

की तरह कुछ तो कुछ कर सकते हैं, जब भी आप चाहते हैं कहीं और उपलब्ध होने के लिए आपको ऐसा लगता है कि करने के लिए जोड़ सकते हैं नाम स्थान:

window.myNamespace.myName = -> "Bob" 

और फिर आप, कहीं से भी कॉल कर सकते हैं window.myNamespace.myName() या बस myNamespace.myName() का उपयोग कर।

वैकल्पिक रूप से, आप CoffeeScript के अपने सभी फ़ाइलों के शीर्ष पर "निर्दिष्ट करता है, तो अपरिभाषित या नल" ऑपरेटर का उपयोग कर सकते हैं:

window.myNamespace ?= {} # create myNamespace if it doesn't already exist 

जो भी फ़ाइल पहले से मूल्यांकन हो जाता है गायब window.myNamespace वस्तु का निर्माण करेगा। बाद का कोड केवल यह देखेगा कि यह पहले से मौजूद है और असाइनमेंट छोड़ें। प्वाइंट है, मूल्यांकन आदेश के बावजूद यह हमेशा उपलब्ध रहेगा।

संपादित करें: myNamespace कम-कैमलकेस क्योंकि यह मूल रूप से एक चर है; नहीं एक निर्माता/वर्ग

परिशिष्ट: आप -b/--bare कमांड लाइन स्विच का उपयोग करके समारोह आवरण से बच सकते हैं, लेकिन के रूप में उल्लेख आवरण एक अच्छी बात है।

+0

बहुत बढ़िया। महान जवाब के लिए बहुत बहुत धन्यवाद। इस शाम को आजमाने की उम्मीद कर रहे हैं। – Brad

+2

शानदार शानदार उत्तर – Arcolye

+0

अच्छाई, क्या एक शानदार जवाब :) – simonmorley

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