2012-04-10 4 views
10

、Example.coffeeCoffeeScriptのクラスメインJavaScriptでアクセスすることはできません

今私ができるようにしたいですそのような私のメインのJavaScriptファイルでインスタンス化する:

d = new Example 
d.render() 

が、クラスは

のように、それはページのスクリプトとして含まれている場合にも定義されていませんあなたがメインファイルにクラスを公開するにはどうすればよい
<script src="Example.js></script> 
<script src="main.js"></script> 

+1

重複としてフラグ:http://stackoverflow.com/questions/9287510/multiple-files-with-coffeescript/9296803 –

答えて

25

を作成します。

class window.Example 
    constructor: -> 
    $.each [1, 2, 3], (key, value) => 
     @test = value 
    return @test 
    render: -> 
    alert @test 

Exampleをそのままwindowに入力します。ほとんどの場合、class @Exampleと言うこともできます。デフォルトでは

、CoffeeScriptのは、名前空間の汚染を防止するための(function() { ... })()ラッパー内の各ファイルをラップします。あなたは、あなたのCoffeeScriptをコンパイルするときに-bを供給することにより、これを防ぐことができます。

-b, --bare

は、トップレベルの機能安全ラッパーなしでJavaScriptをコンパイルします。

しかし、それはあなたにとってオプションではないかもしれません(または醜いかもしれません)。あなたのクラスがロードされる前に、通常のアプローチは、どこかのアプリケーション固有の名前空間を宣言することです:

// Probably in a <script> in your top-level HTML... 
App = { }; 

、その後は適切にあなたのクラスの名前空間:

class App.Example 
    #... 

はその後App名前空間を通じて、すべてを参照してください。

+0

スクリプトタグを使用せずに名前空間を設定することはできますか?私の試みではあまり遠からずにいた。ありがとう! –

+1

@MichaeldeSilva:ブラウザ環境では、クラスの前に '@App?= {}'のようなことを書いて、 'window.App'を初期化することができます。クラスがグローバルスコープに入るようにするには 'class @ C'と言うこともできます。あるいは、require.jsのようなモジュールシステムを使うこともできます。 –

+0

チップありがとう@mu –

4

あなたはwindow名前空間にあるように、それを宣言することによって、(少なくとも、ブラウザの)グローバルにアクセスするクラスを宣言することができ、グローバル変数

window.Example = Example

10

これは古いスレッドであることは知っていますが、他の誰かが役に立つと思う場合は、クラスを "@"で宣言して.coffeeファイル以外のファイル.jsにアクセスできます。

だから

example.coffeeで:example.jsにコンパイルさ

class Introverted 
    honk: -> 
    alert "This class is visible within the .coffee file but not outside" 

class @Extroverted 
    honk: -> 
    alert "This class is visible inside and outside of the .coffee file" 

次いでexample.htmlに使用することができる。

<script src="example.js"></script> 
<script> 
var p = new Extroverted(); // works fine 
p.honk(); 

var i = new Introverted(); // will fail with "Introverted is not defined" 
i.honk(); 
</script> 
+0

エレガントなソリューション! –

+1

これは 'mu is too short'の答えと事実上同じです。 '@ Extroverted'は' this.Extroverted'にコンパイルされます。この場合、 'window.Extroverted'と実質的に同じです。 – Nick

+1

上記のNickさんのコメントを追加するだけで、誰かが不思議に思っている場合に備えて、これがなぜ機能するのかは、 '@'がcoffeescriptの 'this 'のショートカットであるからです。そして、彼が言うように、上記の文脈では、 'this'は' window'ですので、あなたはExtravertedをウィンドウに付けて効果的にグローバルにしています。 – markquezada

関連する問題