0

こんにちは私はJsとCoffeescriptを初めて使用します。これはApp、次の例にある親オブジェクトのプロパティを参照するのが難しいと感じる状況です。

App =
  init: ->
    this.foo = 'bar'
    this.bindEvent()
  bindEvent: ->  
    $('#test').click(this.show)
  show: ->
    alert this.foo

App.init()

太い矢印でうまくいくと思いますが、に変更するshow: =>と、メソッドthisのコンテキストでは、必要なshowオブジェクトではなく、ウィンドウオブジェクトを参照しますApp。誰でもそれを正しく行う方法を教えてもらえますか?

http://jsfiddle.net/kZpHX/

4

1 に答える 1

3

show関数を定義すると、 @(AKA this)は実際にはwindowそうです

show: => console.log(@)

にバインドshowwindowます。問題は、単にオブジェクトを定義しているだけなので、バインドするものがないことです。クラスを定義していないので、thisですwindowApp次のように明示的に参照できます。

App =
  #...
  show: -> alert(App.foo)

デモ: http: //jsfiddle.net/ambiguous/3sRVh/

言うことは期待を設定するので、this.fooininitは正しいことをします。App.init()this

this必要なものを手動で接続することもできます。

bindEvent: ->
  $('#test').click => @show()

# or
bindEvent: ->
  _this = @ # JavaScript style
  $('#test').click -> _this.show()

デモ: http: //jsfiddle.net/ambiguous/byL45/、http//jsfiddle.net/ambiguous/MT8fG/

または、代わりにアプリのクラスを作成することもできます。

class App
  constructor: ->
    @foo = 'bar'
    @bindEvent()
  bindEvent: ->  
    $('#test').click(@show)
  show: =>
    console.log(@foo)

new App

そうshow: =>すれば、期待どおりに動作します。

デモ: http: //jsfiddle.net/ambiguous/byatH/

于 2013-02-18T06:01:18.947 に答える