2

Backbone.js を初めて使用するので、これが正しいかどうかはわかりません。

2 つのモデルを持つ 2 つのビューがあり、イベント アグリゲーターメソッドを使用して 2 つの間でイベントを発生させたいと考えています。

アグリゲーター宣言:

Backbone.View.prototype.eventAggregator = _.extend({}, Backbone.Events);

removeRowしたがって、あるビューでは、メソッドを起動するこのような行があります。

this.eventAggregator.trigger("removeRow", this.row);

別の見方で

MyView = Backbone.View.extend({
    initialize: function() {
      this.eventAggregator.bind("removeRow", this.removeRow);
      this.model.get("rows").each(function(row) {
        // Do stuff
      }); 
    },
    removeRow: function(row) {
       // row is passed in fine
       // this.model is undefined
       this.model.get("rows").remove(row);
    }
});

this.modelが定義されていない理由は理解できたと思いますthis.modelが、コールバックで使用できるように参照を維持するにはどうすればよいですか? モデルを最初のビューに渡してからtrigger呼び出しで戻すことを考えましたが、それではイベント アグリゲーターの要点全体が無意味になるようです。モデルがある場合は、メソッドを直接呼び出すだけ.removeで、最初のビューがモデルを認識しないという利点が失われます。助言がありますか?

4

3 に答える 3

3

拘束力に問題があると思います。

がView インスタンスthisになることを確認するには、次の 2 つの方法があります。

1.使用bindAll

View.initialize()次の行を追加できます。

_.bindAll( this, "removeRow" )

この件に関する @DerickBailey の興味深い投稿

2. バインド宣言でオプションの 3 番目の引数を使用する

このような:

this.eventAggregator.bind("removeRow", this.removeRow, this);

この件に関するバックボーン文書

于 2012-05-30T17:02:27.473 に答える
2

バインドメソッドの3番目のパラメーターとしてViewオブジェクトを指定します。

this.eventAggregator.bind("removeRow", this.removeRow, this);

3番目のパラメーターは、コールバックを呼び出すコンテキストです。ドキュメントを参照してください。

また、短い.bind()の代わりに.on()を使用することもできます。

于 2012-05-30T16:55:39.830 に答える
2

thisスコープが失われないようにバインドする必要があります。他の回答のブログリンクはアンダースコアを使用していますbindAll

initialize: function() {
  _.bindAll(this, 'removeRow');
  this.eventAggregator.bind("removeRow", this.removeRow);
  this.model.get("rows").each(function(row) {
    // Do stuff
  }); 
},
于 2012-05-30T16:55:47.553 に答える