バックボーンの todo demo には、コードに_.bindAll(this,...)
が使用されている箇所がいくつかあります。具体的には、両方のビューのinitialize
関数で使用されます。私の知る限り、次のことを行う必要があります。
this.$('.todo-content').text(content);
しかし、なぜできるのに、なぜ上記のことをしたいのでしょう。
$('.todo-content').text(content);
?
_this.$
_はjQueryのコンテキストをビューの要素に制限するため、操作が高速になります。
さらに、this.$('.todo-item')
は、ビューの要素の外に_todo-item
_クラスを持つ要素を見つけられません。
_.bindAll( this, ... )
は、this.$( selector ).doSomething()
だけでなく、一般に、ビューのメソッドのthis
が常にビュー自体を指すようにするために必要です。
たとえば、モデルが変更されたときにビューを更新する場合は、ビューのrender
メソッドをモデルのchange
イベントにバインドします。
_initialize: function() {
this.model.bind( 'change', this.render );
},
_
_.bindAll( this, 'render' )
がない場合、モデルが変更されると、this
のrender
は、ビューではなくmodelを指すので、 _this.el
_も_this.$
_も他のビューのプロパティも利用できません。
バックボーン0.5.2以降、bind()に3番目の引数を渡すことができるようになったため、ビューで_.bindAll(this ...)を使用して「バインド」コールバック関数のコンテキストを設定する必要がなくなりました。コールバックのコンテキスト(つまり「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
}
});