Backbone .on事件监听器,带有coffeescript的回调函数

时间:2015-12-12 02:51:40

标签: javascript backbone.js coffeescript

我怎样才能在咖啡脚本中正确地写这个?

this.model.on('change:game', function(){
  this.render();
}, this)

我正在尝试我能想到的一切,而我现在正在考虑这个问题:

@model.on 'change:game', -> 
  @render()
@

我很困惑如何处理多个参数,当其中一个是匿名函数时,前两个参数都有一个逗号,但如果我尝试在第三个参数之前添加一个逗号,我会得到语法错误。

3 个答案:

答案 0 :(得分:2)

我相信你可以这样做:

@model.on "change:game", => @render()

使用CoffeeScript,您可以利用" fat"箭头以词法绑定this并简化您的代码。

答案 1 :(得分:2)

您实际上并不需要匿名功能。当你说:

model.on(event, fn, context)
在JavaScript中,事件处理系统最终会说:

fn.apply(context, whatever_arguments_are_used)

fn可以通过任何功能,它不必是匿名的。

转到CoffeeScript并记住@render是对render函数的引用,我们可以说:

@model.on 'change:game', @render, @

并完全跳过匿名函数。或者,您可以使用listenTo自动提供所需的@

@listenTo @model, 'change:game', @render

如果上面的fn获取的参数不匹配事件系统将传递的内容,则此类结构可能会出现问题。在这些情况下,您可以使用bound anonymous function as wmock suggests,您找到的多线方法或一些括号:

@model.on 'change:game', (-> @render()), @
#                        ^            ^ 
再次

listenTo

@listenTo @model, 'change:game', -> @render()

答案 2 :(得分:0)

您有四种方式:

  1. 简单

    @model.on 'change:game', ->
      @render()
    , @
    
  2. 胖箭

    @model.on 'change:game', => @render()
    
  3. 没有匿名功能

    @model.on 'change:game', @render, @
    
  4. 带括号

    @model.on 'change:game', (-> @render()), @
    
  5. 关于如何处理多个参数的第二个问题,其中一些参数是匿名函数。

    四个例子,解释了一切:

    param,func

    func param1, () ->
      # anonymous function 1
      return
    

    param,func,param

    func param1, () ->
      # anonymous function 1
      return
    , param2
    

    param,func,func

    func param1, () ->
      # anonymous function 1
      return
    , () ->
      # anonymous function 2
      return
    

    param,func,param,func

    func param1, () ->
      # anonymous function 1
      return
    , param2, () ->
      # anonymous function 2
      return