0

私はバックボーンのソースであるイベント部分を調べていますが、コンテキストが2回格納されている行を除いて、ほとんどの場合それは理にかなっています。

あるケースでは、に渡された値を取得しますon()。2番目のインスタンスでは、渡された値を取得しますが、渡されなかった場合は、現在のコンテキストを取得します- this

on: function(name, callback, context) {
  if (!(eventsApi(this, 'on', name, [callback, context]) && callback)) return this;
  this._events || (this._events = {});
  var list = this._events[name] || (this._events[name] = []);
  list.push({callback: callback, context: context, ctx: context || this}); // here
  return this;
},

紛らわしいのは、this._events[name]ローカル変数に保存される場合list(オンとオフ)と、ローカル変数に保存される場合effects(トリガー)です。

それぞれの明示的な使用

  • .ctxで使用されtriggerEvents()ます。
  • .contextで使用されoff()ます。
4

1 に答える 1

3

ctxthisイベントがトリガーされたときにコールバック関数内の値として使用されます。たとえば、initializeビューのメソッド内で次のようにします。

this.model.on('change', this.render, this); // where 'this' is the view

次に、render メソッド内で、そのイベントがトリガーthisされると、ビューになります。

contextの特定の使用法が機能するように使用され、offイベント コールバックを選択的に削除する方法が増えます。たとえば、上記の例でモデルに追加されたコールバックを削除する場合は、次のようにします。

this.model.off(null, null, this); // where 'this' is the view from above

これにより、ビューがコンテキストとして渡されたモデルに追加されたイベント ハンドラーが削除されます。

その行は、次のように追加されたイベントを削除しません。

this.model.on('change', this.foo, bar);  // context is bar

複数のイベントに接続していて、異なるコンテキストで追加されたコールバックを削除せずに、それらを一度にすべて削除したい場合に便利です。ただし、 Events に がlistenTo追加されたので、ビューは を呼び出すだけでよいため、代わりにそれを使用する方がおそらく簡単ですstopListening

contextctxが別々に格納される 理由は、異なる値になる可能性があるためです。contextは常に に渡される 3 番目の値でonあり、null または未定義の可能性がありctxますthis

于 2013-03-14T20:08:14.290 に答える