Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Backbone.js 从其他函数调用主干视图函数时出现的问题_Backbone.js_Coffeescript_Backbone Views - Fatal编程技术网

Backbone.js 从其他函数调用主干视图函数时出现的问题

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

我试图在调整窗口大小时调用一些函数。changePosition函数调用得很好,但是tryPrint函数遇到了“未捕获类型错误:Object[Object global]没有方法‘tryPrint’”错误。我不明白为什么会这样。我尝试在resize侦听器中添加一个“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

问题在于,函数内部的
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())
    

    使用
    =>
    可能是最简单的方法,因为在销毁视图时,您希望使用该处理程序,并且
    =>
    将保持函数引用正确。

    我完全不知道胖箭头有什么不同。我真的很感激!