0

私はバックボーンアプリケーションに取り組んでいます。destroyメソッドを持つベースビューを作成し、他のすべてのビューはそれを拡張します。

ビューインスタンスを破棄するときは、ビューにモデルまたはコレクションがある場合、それがリッスンしていたイベントのバインドを解除していることを確認したいと思います。

ビューの初期化でアンダースコアの_.bindAllを使用しているとすると、以下のoffステートメントは参照を削除します。

var DocumentRow = Backbone.View.extend({

  initialize: function() {
      _.bindAll( this );

     this.model.on('change', this.render);
  },


  destroy : function() {
      // Will this work?
      this.model.off(null, null, this);

  }


});

または、そのようなイベントを明示的にバインドする必要がありますか

this.model.on('change', this.render, this);
4

1 に答える 1

3

this.model.on('change', this.render);あなたが望むように動作しません。次のように変更する必要がありますthis.model.on('change', this.render, this);

メソッドのソース(http://backbonejs.org/docs/backbone.html#section-18)を見ると、デフォルトでは変数は何もon設定されていません。contextしたがって、設定しないと、への呼び出しでoffイベントバインディングが正しく検出されません。

onFWIW、私は対応と呼び出しをしなければならないことにうんざりしているoffので、私はそれの多くを処理するためのプラグインを書きました:https ://github.com/marionettejs/backbone.eventbinder

このように使用でき、適切なコンテキストやその他のものを取得することを心配する必要はありません。


var DocumentRow = Backbone.View.extend({

  initialize: function() {
     this.eb = new Backbone.EventBinder();
     this.eb.bindTo(this.model, 'change', this.render);
  },


  destroy : function() {
      this.eb.unbindAll();
  }

});

offこれの本当の利点は、すべてを呼び出す必要がないことonです。を1回呼び出すだけunbindAllで、イベントバインダーインスタンスに保存されているすべてのイベントのバインドが解除されます。

于 2012-11-19T14:22:38.933 に答える