web-dev-qa-db-ja.com

なぜbackbone.jsビューでbindAllを行うのですか?

バックボーンの todo demo には、コードに_.bindAll(this,...)が使用されている箇所がいくつかあります。具体的には、両方のビューのinitialize関数で使用されます。私の知る限り、次のことを行う必要があります。

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

しかし、なぜできるのに、なぜ上記のことをしたいのでしょう。

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

48
LDK

_this.$_はjQueryのコンテキストをビューの要素に制限するため、操作が高速になります。

さらに、this.$('.todo-item')は、ビューの要素の外に_todo-item_クラスを持つ要素を見つけられません。

36
pawlik

_.bindAll( this, ... )は、this.$( selector ).doSomething()だけでなく、一般に、ビューのメソッドのthisが常にビュー自体を指すようにするために必要です。

たとえば、モデルが変更されたときにビューを更新する場合は、ビューのrenderメソッドをモデルのchangeイベントにバインドします。

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

_.bindAll( this, 'render' )がない場合、モデルが変更されると、thisrenderは、ビューではなくmodelを指すので、 _this.el_も_this.$_も他のビューのプロパティも利用できません。

93
Georgii Ivankin

バックボーン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
  }
});
59
Johnny Oshika