我正在尝试学习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
...
问题:
提前感谢您的时间。
巴勒特
答案 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