我是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>
。有人可以帮助我,弄清楚,发生了什么?
答案 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
这些方法。