不能在java/coffeescript中调用实例方法

Can't call instance method in java/coffeescript

本文关键字:调用 实例方法 coffeescript java 不能      更新时间:2023-09-26

我对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

调用bar中的@foo在javascript中被编译为this.foo()。然而,这个失败,因为this.foo未定义。奇怪的this是一个链接,<a href>。有人能帮我弄清楚发生了什么事吗?

我想我知道你的问题是什么了。

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

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

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

你有两种方法来修复它。


首先,你可以显式绑定@foothis,这是常见的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()

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