2012-09-05 32 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'。 –