2011-08-04 45 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'的範圍是正確的,但是那麼我如何引用類功能欄呢?

謝謝!

+0

我找到了一個臨時解決方案:使用 - >然後使用Example :: bar引用bar。它有效,但很醜。任何人有更漂亮的解決方案? –

回答

10

這是因爲在CoffeeScript中@this即當您編譯.coffee到.js文件的別名@this被替換。

如果Example::bar是醜陋的,我不認爲有'更漂亮'的解決方案。

您可以調用.each之前存儲this參考:

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

謝謝麥克。好答案。這表明我沒有錯過一些明顯的東西,我也喜歡self = @選項。我應該想到這一點。仍然習慣它,但喜歡它。 –

+0

在單獨的筆記(樣式)上,您如何看待語法($'.foo')而不是$('。foo')? Topfunky試圖推動第一種風格,但我未定... –

+0

我個人認爲$('。foo')更易於閱讀。 – mak

16

雖然麥是正確的,他沒有指出,在咖啡腳本,你很少需要jQuery的each方法,因爲你注意到它,出拳你執行上下文在未經您許可的情況下。

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

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

咖啡腳本的循環功能,支持each的概念,沒有任何實際的自定義庫中的代碼在所有。而且它們也不會產生新的範圍或上下文,這意味着你不需要任何形式的胖箭頭。

+0

好東西S!!你是完全正確的。我已經將麥克的答案作爲已被接受的答案,但你的方式更加簡潔 - 以及要走的路。我推出了一些老js的轉換成coffeescript,這就是爲什麼我會遇到這個問題,但現在我知道更好。謝謝。 –

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))