2011-12-07 6 views
1
(-> 
    jQuery -> 
    globalThis = @ 
    $('#emailTypes').change -> 
     globalThis.toggleEmailOptions() 

    toggleEmailOptions = -> 
    $('.emailTypeOptions').fadeOut 'fast', -> 
     for emailType in $('#emailTypes').val() 
     $("##{emailType}Options").fadeIn() 


).call this 

これは私の.coffeeファイルです。ただし、toggleEmailOptions関数はjQuery readyの対象外です。どのように私は範囲でそれを作ることができますか?ブラウザでCoffeeScriptの機能を正しくスコープするにはどうすればよいですか?

+0

とにかくtoggleEmailOptionsがローカル変数であるため、jQuery.Readyコールバック内で移動することができます。 toggleEmailOptionsをグローバルスコープで使用できるようにするには、 - >の代わりに=>を使用して、これを関数内に保持し、toggleEmailOptionsの代わりに@toggleEmailOptionsを宣言します。 – Guillaume86

答えて

1

私はのCoffeeScriptはすでにそれを行うので、あなたがラップする必要はありませんが、ここで私はあなたのコードを書き換えるだろうかと思う:

jQuery -> 
    toggleEmailOptions = -> 
    $('.emailTypeOptions').fadeOut 'fast', -> 
     for emailType in $('#emailTypes').val() 
     $("##{emailType}Options").fadeIn() 

    $('#emailTypes').change -> 
    toggleEmailOptions() 
+0

これはいいですが、それは私がそれらを使う前に常に関数を定義しなければならないということです。私は私のコードを特別な方法で整理したいので、そうしないでください。 – Shamoon

+0

実際には、最初に宣言する必要はありません。ただimhoを読みやすく、http://js2coffee.org/に貼り付けてください。toggleEmailOptions変数はすべてのケースでコールバックの開始時に宣言されています。 ) – Guillaume86

2

http://jashkenas.github.com/coffee-script/

からのCoffeeScriptに関する通常の警告が適用されます - あなたのインラインスクリプトが閉鎖ラッパー内 ランますので、あなたがグローバル 変数や関数を公開したい場合は、ウィンドウオブジェクトに取り付けます。

node.jsを使用している場合はexportsにバインドしてください。ご例えば

、それは次のようになります。

window.toggleEmailOptions = -> 
+0

'$('#emailTypes ')変更 - > あなたが関数の呼び出しではなく関数を呼び出す結果値にバインドしています – Shamoon

+0

[この特定のファイル内の "グローバル"なのでしょうか? – Shamoon

+1

100%確かではありませんが、私はあなたの "ファイルスコープ"のためのwindow ==これを設定していますデフォルトでは、http://webreflection.blogspot.com/2009/10/es5-and-function-default-scopeをご覧ください。html –

0

ありますされていますここにいくつかの問題があります。 1つは、@/thisがjQueryコールバックのグローバルオブジェクト(window)であると仮定しているようです。しかし、そうでないことは容易にわかります。

jQuery -> console.log @ is window # false 

コールバックは、ライブラリが必要とするあらゆるコンテキストで呼び出すことができます。この場合、@documentです。そしてdocument.toggleEmailOptionsは存在しません。あなたはtoggleEmailOptionsがグローバルになりたい場合は

さらに、あなたは(あなたのファイルの最も外側のスコープで@ is window以来、または/ this@windowに添付する必要があります。これは、toggleEmailOptions = ...と書くだけで、CoffeeScriptはvar宣言を使ってファイル内でスコープします。コンパイルされたJSを見ることでこれを見るのは簡単です:varは常にそのスコープの一番上にあります。幸いにも、ファイルスコープはあなたが望んでいたものです。

だから基本的にそれを考えすぎないでください!あなたが望むのは:

jQuery -> 
    $('#emailTypes').change -> 
    toggleEmailOptions() 

残りはそのままです。

関連する問題