1

次のクラスを coffeescript に用意します。

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

2 に答える 2

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。好みの問題ですが、アンダースコアよりもキャメルケースの方がメソッド名に適していると思います。

于 2012-09-06T13:21:22.063 に答える
1

あなたはより良い解決策を見つけました。しかし、あなたが望むなら、あなたはこれを書くことができます:

mouse_down: ->
    self = @ 
    @canvas.mousedown (e) ->
      mouse_x = e.pageX - self.canvas[0].offsetLeft
      ### ... ###
      self.redraw()
于 2012-09-06T10:20:56.933 に答える