2011-11-13 5 views
48

मैं एक रेल नियंत्रक जिसमें मैं एक उदाहरण चर की स्थापना कर रहा हूँ एक स्लिम टेम्पलेट के अंदर CoffeeScript इंजन में उदाहरण चर का उपयोग करने की -कैसे

@user_name = "Some Username" 

मेरी .slim टेम्पलेट में मैं कॉफी इंजन का उपयोग कर रहा जावास्क्रिप्ट उत्पन्न करने के लिए और क्लाइंट-sie जावास्क्रिप्ट कोड से बाहर उपयोगकर्ता नाम प्रिंट करना चाहते हैं -

coffee: 
    $(document).ready -> 
    name = "#{@user_name}" 
    alert name 

लेकिन यह जावास्क्रिप्ट है कि उत्पन्न किया जा रहा है ??

$(document).ready(function() { 
    var name; 
    name = "" + this.my_name; 
    alert(name); 
} 

मैं अपने CoffeeScript कोड में नियंत्रक उदाहरण चर का उपयोग करना ??

मैं इसे हैमल के रूप में टैग कर रहा हूं क्योंकि मुझे लगता है कि कॉफीस्क्रिप्ट का उपयोग करते समय हैमल का एक ही मुद्दा होगा।

+1

@ थिलो नो, वह रूबी वैरिएबल '@ user_name' इंजेक्ट करने का प्रयास कर रहा है। रूबी और कॉफीस्क्रिप्ट एक ही स्ट्रिंग इंटरपोलेशन सिंटैक्स का उपयोग करते हैं। –

+1

मैं देखता हूं। बीटीडब्लू, वैरिएबल नाम '# {@ user_name} " ' से 'this.my_name' में कैसे बदलता है? – Thilo

+0

क्योंकि कॉफ़ीस्क्रिप्ट में, @prop इस.प्रॉप –

उत्तर

86

क्या हो रहा है यह है कि "#{@user_name}" को कॉफीस्क्रिप्ट के रूप में व्याख्या किया जा रहा है, न कि रूबी कोड के रूप में जिसका मूल्यांकन किया गया है और कॉफीस्क्रिप्ट स्रोत में इंजेक्शन दिया गया है। आप पूछ रहे हैं, "मैं अपने कॉफीस्क्रिप्ट स्रोत में रुबी चर कैसे लगा सकता हूं?"

संक्षिप्त उत्तर यह है: ऐसा मत करो। रेल टीम ने 3.1 में टेम्पलेट्स में एम्बेडेड कॉफीस्क्रिप्ट का समर्थन न करने का एक जानबूझकर निर्णय लिया, क्योंकि प्रत्येक अनुरोध पर कॉफीस्क्रिप्ट संकलित करने के लिए महत्वपूर्ण प्रदर्शन ओवरहेड है (जैसा कि आपको करना होगा यदि आपने स्रोत में इंजेक्शन देने के लिए मनमाने ढंग से तारों की अनुमति दी है) ।

मेरी सलाह, उदा, शुद्ध जावास्क्रिप्ट के रूप में अलग से अपनी रूबी चर सेवा करने के लिए, और फिर अपने CoffeeScript से वे चर संदर्भ, .:

javascript: 
    user_name = "#{@user_name}"; 
coffee: 
    $(document).ready -> 
    name = user_name 
    alert name 
+0

आपके उत्तर के लिए धन्यवाद, इसलिए मूल रूप से आपने जो सुझाव दिया है वह प्रदर्शन परिप्रेक्ष्य से ठीक है? – kapso

+2

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

30

मैं हर हालत में इनलाइन जावास्क्रिप्ट से बचना चाहिए है।

अपने जावास्क्रिप्ट से उपयोग करने के लिए अपने एचटीएमएल में चर स्टोर करने का एक अच्छा तरीका है, एचटीएमएल 5 डेटा-एट्रिब्यूट्स का उपयोग करना है। यह आपके जावास्क्रिप्ट को अविभाज्य रखने के लिए आदर्श है।

+0

यदि आप जावास्क्रिप्ट एमवीसी का उपयोग कर रहे हैं और सर्वर पर एकाधिक HTTP अनुरोध करने से बचना चाहते हैं तो यह सहायक नहीं होगा। http://backbonejs.org/#FAQ-bootstrap – jackyalcine

+0

यदि आप जावास्क्रिप्ट एमवीसी का उपयोग कर रहे हैं, तो आप डेटा प्राप्त करने के लिए ज्यादातर AJAX अनुरोध करते हैं, और क्लाइंट पर एचटीएमएल प्रस्तुत करते हैं। लेकिन उदाहरण के लिए, सामान्य कॉन्फ़िगरेशन पैराम्स आप अभी भी HTML/body/container में डेटा विशेषताओं में एक बार भेज सकते हैं। – nathanvda

+0

सच है, सच है।क्षमा करें अगर मैं बहुत परेशान हो गया! – jackyalcine

2

तुम भी इस्तेमाल कर सकते हैं:

$(document).ready -> 
    name = <%= JSON.generate @user_name %> 
    alert name 

इसका कारण यह है JSON जावास्क्रिप्ट का एक सबसेट है।

+1

यह बार्फ़ कठिन है। या कम से कम डैशिंग के अंदर करता है। कॉफी फाइलें। –