为什么bind.js视图中的bindAll?

时间:2011-05-21 01:39:13

标签: backbone.js underscore.js

在主干todo demo中,代码中有一些使用_.bindAll(this,...)的位置。具体来说,它用于两个视图的initialize函数。据我所知,有必要做以下事情:

this.$('.todo-content').text(content);

但是,当人们可以做的时候,为什么要做上述事情:

$('.todo-content').text(content);

3 个答案:

答案 0 :(得分:93)

_.bindAll( this, ... )不仅对this.$( selector ).doSomething()是必要的,而且通常要确保视图方法中的this始终指向视图本身。

例如,如果我们想在模型更改时刷新视图,我们会将视图的render方法绑定到模型的change事件:

initialize: function() {
    this.model.bind( 'change', this.render );
},

如果没有_.bindAll( this, 'render' )this中的模型更改render将指向模型,而不是视图,因此我们不会this.elthis.$或任何其他视图的属性都不可用。

答案 1 :(得分:59)

从Backbone 0.5.2开始,不再需要在视图中使用_.bindAll(this ...)来设置“bind”回调函数的上下文,因为您现在可以将第3个参数传递给bind ()将设置回调的上下文(即“this”)。

例如:

var MyView = Backbone.View.extend({
  initialize: function(){
    this.model.bind('change', this.render, this);
  },
  render: function(){
    // "this" is correctly set to the instance of MyView
  }
});

答案 2 :(得分:36)

this.$将jQuery的上下文限制为视图的元素,因此操作更快。

另外,this.$('.todo-item')将无法在您的视图元素之外找到todo-item类的元素。