为什么在backbone.js视图中bindAll?

在backbone的todo演示中 ,代码有几个使用了_.bindAll(this,...)的地方。 具体来说,它用在两个视图的initialize函数中。 据我所知,有必要做到以下几点:

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

但是,为什么要这样做呢?

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

this.$限制jQuery的上下文到视图的元素,所以操作更快。

另外, this.$('.todo-item')不会在你的视图的元素外面find你的元素。

_.bindAll( this, ... ) this.$( selector ).doSomething() _.bindAll( this, ... )是必要的,但是通常要确保在你的视图的方法中它总是指向视图本身。

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

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

没有_.bindAll( this, 'render' ) ,当模型在render改变它将指向模型 ,而不是视图,所以我们不会有this.elthis.$或其他视图的属性可用。

从Backbone 0.5.2开始,不再需要在视图中使用_.bindAll(this …)来设置“绑定”callback函数的上下文,因为您现在可以将第三个parameter passing给bind()将设置callback的上下文(即“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 } });