2011-08-04 16 views
7

coffeescriptクラスの太った矢印の機能では、どのようにクラスのスコープと関数にアクセスできますか?Coffeescriptのクラスとスコープと太い矢印と細い矢印

例:私は=>を使用している場合

class Example 
    foo: -> 
    $('.element').each => # or -> 
     @bar($(this))  # I want to access 'bar' as well as the jquery element 
    bar: (element) -> 
    element.hide() 

は、したがって、この例では、その後、@はクラスのこのを指しますが、私が使用している場合、一方、「これは」の場合、間違っています - >それぞれの場合、 'this'は正しくスコープされますが、クラスファンクションバーをどのように参照するのですか?

ありがとうございます! CoffeeScriptの@にあなたが.jsファイルにあなたの.coffeeをコンパイルthisすなわちの別名であるためだ

+0

私は一時的な解決策を見つけた:使用 - >その後、例::バーを使用してバーを参照します。それは動作しますが、それは醜いです。誰もがもっときれいな解決策を持っていますか? –

答えて

10

@thisに置き換えられます。

Example::barが醜い場合、私は「よりきれいな」解決策はないと思います。

あなたは.eachを呼び出す前にthisへの参照を格納することができます

class Example 
    foo: -> 
    self = @ 
    $('.element').each -> 
     self.bar($(this)) # or self.bar($(@)) 
    bar: (element) -> 
    element.hide() 
+0

ありがとうございました。いい答えだ。それは私が何かを見逃していないことが示され、また、私は自己= @オプションが好きです。私はそれを考えていたはずです。まだそれに慣れていますが、好きです。 –

+0

(スタイルの)別の注記では、$( '。foo')の代わりに構文($ '.foo')についてどう思いますか? Topfunkyは最初のスタイルをプッシュしようとしていましたが、私は未定です... –

+0

個人的に私は$( '。foo')を読みやすくしています。 – mak

16

MAKは右ですが、彼はコーヒースクリプトで、あなたはほとんどあなたが気づいたとして、あなたのパンチjQueryのeach方法を、必要としないことを指摘して失敗しましたあなたの許可なく顔で実行コンテキスト。

class Example 
    foo: -> 
    for element in $('.element') 
     @bar $(element) 

    bar: (element) -> 
    element.hide() 

コーヒースクリプトのループ機能はまったく実際のカスタムライブラリのコードなしeachの概念をサポートしています。そして、彼らはまた、あなたがどんな種類の太い矢が必要なのかを意味する新しい範囲またはコンテキストを生成しません。

+0

良いものSqueegy!あなたはまったく正しい。私はマックの答えを受け入れられたものとして残しましたが、あなたのやり方はもっときれいです - そして行く方法。私はcoffeescriptにいくつかの古いjsの変換を開始したので、私はこの問題にぶつかったのですが、今はよく分かります。ありがとう。 –

3

異なる解決策を確認した後。ここで何かがそれぞれ最も完全なサンプルとして私のために表示され、クリックしてください:

class MainApp 
    self = [] 

    constructor: -> 
    self = @ 

    toDoOnClick: (event) -> 
    self.bar($(event.target)) #hide the clicked object 

    bar: (element) -> 
    element.hide() 

    sampleMethod:-> 
    $(".myDiv").click (e) -> self.toDoOnClick(e) 
    $('.element').each -> 
     self.bar($(this)) 
関連する問題