2011-08-16 6 views
8

coffeescriptコンパイラは、何らかの理由で、コンパイル時にすべての.coffeeファイルを関数内にラップしています。たとえば、私はtest.coffee持っている場合:関数内のCoffeescriptラッピングファイル

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> 

I前にJSで多かったのですが、私はコーヒーコンパイラを疑っていませんが、うまくいくはずです。方法

+0

あなたのcoffeescript行を変更して、TestClass初期化子に値を渡してみてください-'test = new TestClass( 'hello world') ' – arunkumar

+0

JSファイル/モジュール間のコードの共有について[私の答えはこちら[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

HTMLにイベントリスナーを追加しないでください。それらをJavaScriptに追加してください。イベントハンドラを定義するのと同じスコープにあることが望ましいです。

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

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

あなたは絶対に、グローバルスコープにウィンドウオブジェクトへの輸出を何かをエクスポートする必要がある場合:

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

を参照してくださいその問題を解決する。しかし今、私はHTMLに複数のjsファイルを含めると、互いのクラスにアクセスすることができないという問題が発生しています。それは、それらがすべて非グローバルスコープで定義されているからです。それが私がそれらを探しているところです。 – DrPepper

+1

はい、それらはすべて関数にラップされています。グローバルな名前空間オブジェクト( 'window.NS = {}')を作成し、その名前空間にクラスをエクスポートします( 'NS.TestClasses = TestClasses')。名前空間は、ファイル間でグローバルにアクセス可能です。 – katspaugh

+0

さて、それはすべて動作しています。本当にありがとう。 – DrPepper

9

は、ファイル/モジュール間のJSコードを共有する上でmy answer hereを参照してください。また、ラッパー関数は意図しないグローバル変数を防ぐために設計されています。 --bareをコーヒーコンパイラのコマンドラインツールに渡すことで無効にすることができますが、それは正当な理由がある場合にはベストプラクティスです。

関連する問題