我正在尝试在调整窗口大小时调用一些函数。调用changePosition函数就好了,但tryPrint函数遇到了“Uncaught TypeError:Object [object global]没有方法'tryPrint'”错误。我不明白为什么会这样。我尝试在调整大小的侦听器中添加一个“this”参数,但这并没有把我带到任何地方......
class App.Views.Pages.WorkView extends Backbone.View
template: JST["backbone/templates/pages/work"]
initialize: () ->
this.render()
$(window).on('resize', this.changePosition)
tryPrint: ->
console.log("TRYING")
changePosition: ->
this.tryPrint()
render: =>
$(@el).html(@template())
return this
答案 0 :(得分:2)
问题是函数内this
(CoffeeScript中的AKA @
)的值取决于函数的调用方式,除非您将函数绑定到特定对象。您这样做是为了将函数绑定到事件:
$(window).on('resize', this.changePosition)
在这种情况下调用this
时,jQuery的on
会将window
设置为changePosition
:
当jQuery调用处理程序时,
this
关键字是对传递事件的元素的引用;对于直接绑定事件,这是附加事件的元素,对于委托事件,这是一个匹配selector
的元素。
如果您希望this
成为视图,请在定义方法时使用fat-arrow (=>
):
changePosition: =>
@tryPrint()
其他选择:
使用绑定功能:
$(window).on('resize', @changePosition.bind(@))
$(window).on('resize', _(@changePosition).bind(@))
$(window).on('resize', $.proxy(@changePosition, @))
#...
手动设置this
:
that = @
$(window).on('resize', -> that.changePosition())
使用=>
可能是最简单的,因为您在销毁视图时需要off
处理程序,而=>
会使函数引用保持正确。