Backbone.js 从其他函数调用主干视图函数时出现的问题
我试图在调整窗口大小时调用一些函数。changePosition函数调用得很好,但是tryPrint函数遇到了“未捕获类型错误:Object[Object global]没有方法‘tryPrint’”错误。我不明白为什么会这样。我尝试在resize侦听器中添加一个“this”参数,但这并没有导致我出现任何问题Backbone.js 从其他函数调用主干视图函数时出现的问题,backbone.js,coffeescript,backbone-views,Backbone.js,Coffeescript,Backbone Views,我试图在调整窗口大小时调用一些函数。changePosition函数调用得很好,但是tryPrint函数遇到了“未捕获类型错误:Object[Object global]没有方法‘tryPrint’”错误。我不明白为什么会这样。我尝试在resize侦听器中添加一个“this”参数,但这并没有导致我出现任何问题 class App.Views.Pages.WorkView extends Backbone.View template: JST["backbone/templates/page
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
问题在于,函数内部的
this
(在CoffeeScript中称为@
)的值取决于函数的调用方式,除非您已将函数绑定到特定对象。您这样做是为了将函数绑定到事件:
$(window).on('resize', this.changePosition)
在这种情况下,当调用changePosition
时,jQuery将this
设置为window
:
当jQuery调用处理程序时,this
关键字是对传递事件的元素的引用;对于直接绑定事件,这是附加事件的元素;对于委派事件,这是匹配选择器的元素
如果希望此
成为视图,请在定义方法时使用:
changePosition: =>
@tryPrint()
其他选择:
使用绑定函数:
$(window).on('resize', @changePosition.bind(@))
$(window).on('resize', _(@changePosition).bind(@))
$(window).on('resize', $.proxy(@changePosition, @))
#...
手动设置此
:
that = @
$(window).on('resize', -> that.changePosition())
使用
=>
可能是最简单的方法,因为在销毁视图时,您希望使用该处理程序,并且=>
将保持函数引用正确。我完全不知道胖箭头有什么不同。我真的很感激!