为什么在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.el
和this.$
或其他视图的属性可用。
从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 } });