2011-08-16 10 views
8

कॉफ़ीस्क्रिप्ट कंपाइलर किसी कारण से, मेरे सभी कॉफ़ी फ़ाइलों को संकलित करते समय फ़ंक्शन में लपेटता है। उदाहरण के लिए, अगर मैं test.coffee है:फ़ंक्शन में कॉफ़ीस्क्रिप्ट रैपिंग फ़ाइलें

class TestClass 
    constructor: (@value) -> 

    printValue:() -> 
     alert(@value) 

printAValue =() -> 
    test = new TestClass() 
    test.printValue() 

तो मैं मिल test.js:

(function() { 
    var TestClass, printAValue; 
    TestClass = (function() { 
    function TestClass(value) { 
     this.value = value; 
    } 
    TestClass.prototype.printValue = function() { 
     return alert(this.value); 
    }; 
    return TestClass; 
    })(); 
    printAValue = function() { 
    var test; 
    test = new TestClass(); 
    return test.printValue(); 
    }; 
}).call(this); 

मेरे सरल html फ़ाइल इस के साथ काम नहीं करेगा:

<html> 
    <head> 
     <script src="test.js"></script> 
    </head> 
    <body onload="printAValue()"> 
    </body> 
</html> 

मैं पहले जेएस के साथ काम नहीं किया है, और मुझे कॉफी कंपाइलर पर शक नहीं होगा, लेकिन जिस तरह से इसे काम करना चाहिए? कैसे

+0

टेस्ट क्लास प्रारंभकर्ता -'test = नया टेस्टक्लास ('हैलो वर्ल्ड') ' – arunkumar

+0

पर मान पास करने के लिए अपनी कॉफ़ीस्क्रिप्ट लाइन को बदलने का प्रयास करें, [मेरा जवाब यहां] [1] जेएस फाइल/मॉड्यूल के बीच कोड साझा करने पर देखें। [1]: http://stackoverflow.com/questions/6951438/accessing-document-within-coffeescripts-default-wrapper/6951641#6951641 –

+0

यह अब तक का सबसे लोकप्रिय सवाल CoffeeScript के बारे में पूछा जाता है पर इसलिए। Http://stackoverflow.com/q/6481986/66226 देखें, http://stackoverflow.com/q/4214731/66226, http: //stackoverflow.com/q/5693211/66226 ... –

उत्तर

7

एचटीएमएल में ईवेंट श्रोताओं को कभी भी जोड़ें। उन्हें अपनी जावास्क्रिप्ट में जोड़ें, अधिमानतः उसी दायरे में जिसमें आप ईवेंट हैंडलर को परिभाषित करते हैं।

printAValue =() -> 
    test = new TestClass() 
    test.printValue() 

document.body.addEventListener('load', printAValue, false) 

आप पूरी तरह, वैश्विक क्षेत्र के लिए कुछ निर्यात करने के लिए विंडो ऑब्जेक्ट के लिए निर्यात की जरूरत है:

window.printAValue =() -> 
    test = new TestClass() 
    test.printValue() 
+0

ठीक है, धन्यवाद उस समस्या को हल करना। लेकिन अब मुझे एक मुद्दा मिल रहा है जहां अगर मैं अपने एचटीएमएल में एकाधिक जेएस फाइलों को शामिल करता हूं, तो उन्हें एक-दूसरे के वर्गों तक पहुंच नहीं मिल रही है। क्या ऐसा इसलिए है क्योंकि वे सभी गैर-वैश्विक दायरे में परिभाषित किए जा रहे हैं, और यही वह जगह है जहां मैं उन्हें ढूंढ रहा हूं? – DrPepper

+1

हां, वे सब एक समारोह में लपेटे गए हैं। कुछ वैश्विक नेमस्पेस ऑब्जेक्ट बनाएं ('window.NS = {}') और अपने वर्गों को उस नेमस्पेस ('NS.TestClasses = TestClasses') में निर्यात करें। नामस्थान दुनिया भर में फाइलों पर पहुंच योग्य होगा। – katspaugh

+0

ठीक है, यह सब काम कर रहा है। बहुत बहुत धन्यवाद। – DrPepper

9

फ़ाइलें/मॉड्यूल के बीच जे एस कोड साझा करने पर my answer here देखें। इसके अलावा एफवाईआई रैपर फ़ंक्शन डिज़ाइन द्वारा अनजाने वैश्विक चर को रोकने के लिए है। आप कॉफ़ी कंपाइलर कमांड लाइन टूल पर --bare पास करके अक्षम कर सकते हैं, लेकिन यह अच्छे कारण के साथ सबसे अच्छा अभ्यास है।

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