2012-09-05 46 views
1

有在CoffeeScript的下面的類:Coffescript「@」或在此函數和類

class Canvas 
    constructor: (finder) -> 
    @canvas = $(finder) 
    @mouse_down() 
    mouse_down: -> 
    @canvas.mousedown (e) -> 
     mouse_x = e.pageX - @offsetLeft 
     ### ... ### 
     @redraw() 
    redraw: -> 
    ### ... ### 

問題是調用類對象redraw方法在mousedown功能。什麼是最好的解決方案呢?我只找到:

mouse_down: -> 
    @canvas.mousedown (e) => 
     mouse_x = e.pageX - @canvas[0].offsetLeft 
     ### ... ### 
     @redraw() 
+1

恭喜 - 您已找到解決方案! [fat arrow](http://coffeescript.org/#fat_arrow)'=>'將函數綁定到'@'(或'this')。 –

+0

@LinusGThiel,它是唯一的解決方案嗎?它看起來不漂亮。 – tiktak

+0

總有[Tim Toady](http://en.wikipedia.org/wiki/There's_more_than_one_way_to_do_it),但這正是'=>'的用例。什麼,特別是,你不喜歡它? –

回答

2

檢查了這一點:

class Canvas 
    constructor: (finder) -> 
     @canvas = $(finder) 
     @mouse_down() 
    mouse_down: -> 
     redrawCallback = @redraw 
     @canvas.mousedown (e) -> 
     mouse_x = e.pageX - @offsetLeft 
     ### ... ### 
     redrawCallback() 
    redraw: -> 
     ### ... ### 

如果重繪無論如何是指@(Canvas類)做這樣的好(這是更安全反正):

class Canvas 
    constructor: (finder) -> 
    @canvas = $(finder) 
    @mouse_down() 
    mouse_down: -> 
    redrawCallback = => @redraw() 
    @canvas.mousedown (e) -> 
     mouse_x = e.pageX - @offsetLeft 
     ### ... ### 
     redrawCallback() 
    redraw: -> 
    ### ... ### 

PS。雖然這是一個口味問題,但我相信駱駝案例會更好地匹配方法名稱而不是強調。

1

您發現了一個更好的解決方案。但是,如果你願意,你可以這樣寫:

mouse_down: -> 
    self = @ 
    @canvas.mousedown (e) -> 
     mouse_x = e.pageX - self.canvas[0].offsetLeft 
     ### ... ### 
     self.redraw() 
+0

好的,謝謝你!可能只是@offserLeft? – tiktak

+0

@tiktak對,我明白你的觀點。是的,在這裏你可以使用'@offsetLeft'。 –