无法在java / coffeescript中调用实例方法

时间:2014-08-11 21:04:13

标签: javascript coffeescript

我是coffeescript和javascript的新手。我写了下面的例子。 调用bar时失败。

class FooBar
  constructor: ->
    @cleanBinding()
    @addBinding()
    @foo

  addBinding: ->
    $(document).on 'click', '.foo', @foo
    $(document).on 'input', 'input#bar', @bar

  cleanBinding: ->
    $(document).off 'click', '.foo'
    $(document).off 'input', 'input#bar'

  foo: ->
    alert('foo')

  bar: (e) ->
    @foo()
    e.preventDefault()

@FooBar = FooBar

@foo中的来电bar在javascript中被编译为this.foo()。但是,失败,因为this.foo未定义。奇怪的this是一个链接<a href>。有人可以帮助我,弄清楚,发生了什么?

1 个答案:

答案 0 :(得分:1)

我想我弄明白你的问题是什么。

真正的问题是您如何注册事件处理程序:

$(document).on 'click', '.foo', @foo

因为@foo这里只是一个没有任何上下文的FooBar::foo函数。

你有两种解决方法。


首先,您可以将@foo显式绑定到this,这是常见的JS解决方案:

$(document).on 'click', '.foo', @foo.bind this

其次,在定义方法时,您可以使用CoffeeScript胖箭头操作符=>

class FooBar
  constructor: ->
    @cleanBinding()
    @addBinding()
    @foo

  addBinding: ->
    $(document).on 'click', '.foo', @foo
    $(document).on 'input', 'input#bar', @bar

  cleanBinding: ->
    $(document).off 'click', '.foo'
    $(document).off 'input', 'input#bar'

  foo: =>
    alert('foo')

  bar: (e) =>
    @foo()
    e.preventDefault()

当创建.bind()类的新实例时,它会自动告诉CoffeeScript编译器FooBar这些方法。