从其他函数调用Backbone视图函数的问题

时间:2013-10-26 22:45:15

标签: backbone.js coffeescript backbone-views

我正在尝试在调整窗口大小时调用一些函数。调用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

1 个答案:

答案 0 :(得分:2)

问题是函数内this(CoffeeScript中的AKA @)的值取决于函数的调用方式,除非您将函数绑定到特定对象。您这样做是为了将函数绑定到事件:

$(window).on('resize', this.changePosition)
在这种情况下调用this时,jQuery的on会将window设置为changePosition

  

当jQuery调用处理程序时,this关键字是对传递事件的元素的引用;对于直接绑定事件,这是附加事件的元素,对于委托事件,这是一个匹配selector的元素。

如果您希望this成为视图,请在定义方法时使用fat-arrow (=>)

changePosition: =>
    @tryPrint()

其他选择:

  1. 使用绑定功能:

    $(window).on('resize', @changePosition.bind(@))
    $(window).on('resize', _(@changePosition).bind(@))
    $(window).on('resize', $.proxy(@changePosition, @))
    #...
    
  2. 手动设置this

    that = @
    $(window).on('resize', -> that.changePosition())
    
  3. 使用=>可能是最简单的,因为您在销毁视图时需要off处理程序,而=>会使函数引用保持正确。