不能在java/coffeescript中调用实例方法
Can't call instance method in java/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
调用bar
中的@foo
在javascript中被编译为this.foo()
。然而,这个失败,因为this.foo
未定义。奇怪的this
是一个链接,<a href>
。有人能帮我弄清楚发生了什么事吗?
我想我知道你的问题是什么了。
真正的问题是你如何注册你的事件处理程序:
$(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()
当创建新的FooBar
类实例时,它会自动告诉CoffeeScript编译器.bind()
这些方法
相关文章:
- 如何在单击复选框后调用控制器方法
- TypeError:在不兼容的接收器nodejs上调用了方法Uint8Array.length
- jQuery插件-从插件中调用公共方法
- SignalR:调用集线器方法时出现内部服务器错误
- 从Javascript调用Applet方法
- 如何在Javascript中调用此方法
- 在Javascript中对类的每个实例调用一个方法
- 从实例方法调用实例方法
- 如何根据所选选项调用实例方法
- 如何在匿名函数中调用实例方法
- 在JavaScript类中调用父方法,但stll可以访问对象实例中的原型方法
- 将hasOwnProperty作为调用方法的直接静态引用进行调用的好处,而不是将其作为对象实例方法进行调用
- 调用类实例方法onclick javascript
- 在Javascript中调用不带传递函数的组合私有类成员的公共实例方法
- 如何在我的javascript文件中调用各种goog.i18n.TimeZone实例方法
- Javascript OOP -对象如何调用其实例方法
- 不能在java/coffeescript中调用实例方法
- 在JavaScript中使用Array对象对数组内部的实例调用任意方法
- Angularjs用不同的url调用实例化的资源方法
- 在es6的构造过程中对所有实例方法自动调用bind()