3

我正在尝试学习 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 代码似乎更清晰、更明确。这只是个人喜好问题吗?

在此先感谢您的时间。

巴拉特

4

1 回答 1

2

jQuery 的“on”用于与 Backbone 的“bind/bindAll”完全不同的目的。jQuery 的“on”的目的是在事件发生时调用一个函数。Underscore 的bind 或bindAll 的目的是将一个函数绑定到一个对象上,这意味着无论何时调用该函数,this的值都会是你调用bind 时传递的对象。Underscore 的 bindAll 与 bind 做的事情完全相同,除了一次有多个函数。

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

Backbone 还实现了一个“on”函数,它更类似于 jQuery 的“on”,但用于 Backbone 事件。可以在主干文档上阅读

于 2012-09-17T18:27:28.147 回答