Backbone js bindAll / bind与jQuery on

时间:2012-09-17 18:13:30

标签: jquery binding backbone.js

我正在尝试学习Backbone js,并且无法理解使用下划线库提供的bindAll / bind函数和函数提供的jQuery之间的事件绑定之间的区别。这是Coffeescript中的一个例子:

class Raffler.Views.Entry extends Backbone.View
  template: JST['entries/entry']
  tagName: 'li'

  events:
    'click': 'showEntry'

  initialize: ->
    @model.on('change',@render,this)
    @model.on('highlight',@highlightWinner,this)

  showEntry: ->
    Backbone.history.navigate("entries/#{@model.get('id')}", true)

  highlightWinner: ->
    $('.winner').removeClass('highlight')
    @$('.winner').addClass('highlight')

  render: ->
    $(@el).html(@template(entry: @model))
    this

This is a snippet of code from Ryan Bate's RailsCasts' on Backbone.js

Seems to me that the same code can be written using the underscore bindAll and bind functions as follows:

class Raffler....
  ...
  initialize: ->
    _bindAll @, 'render', 'highlightWinner'
    @model.bind 'change',@render
    @model.bind 'highlight',@highlightWinner
  ...

问题:

  1. 这两个在功能上是否相同?
  2. 如果是,那么jQuery代码似乎更清晰,更明确。这仅仅是个人偏好的问题吗?
  3. 提前感谢您的时间。

    巴勒特

1 个答案:

答案 0 :(得分:2)

jQuery的“on”用于与Backbone的“bind / bindAll”完全不同的目的。 jQuery的“on”的目的是在事件发生时调用函数。 Underscore的bind或bindAll的目的是将一个函数绑定到一个对象,这意味着每当调用该函数时, this 的值将是您在调用bind时传递的对象。除了多个函数之外,Underscore的bindAll与bind完全相同。

你会发现在使用Backbone构建时这些将一起使用。假设你有一个模型设置了一个函数,你可以在内部调用它来修改模型。如果你使用jQuery或Backbone的“on”函数将该函数绑定到一个事件,当它触发的事件时, this 将是触发事件的DOM元素,意味着对 this的任何引用< / em>在该函数中将不再起作用,因为不再是模型,它是一个dom元素。但是,如果我们在模型的构造函数中调用_.bind(this,callback),它将确保 this 始终是模型。

Backbone还实现了一个“on”函数,它更类似于jQuery的“on”,但用于Backbone事件。可以阅读on the backbone docs