4

したがって、この行が何をするのかわかりません

      obj.on(name, typeof name === 'object' ? this : callback, this);

listenTo の Backbone.js 実装で。また、listenTo は、別のオブジェクトがイベントに応答したときに 1 つのオブジェクトを動作させる方法であることも理解しています。Backbone の Web サイトには、listenTo を使用する利点は、元のオブジェクトを破棄すると、他のイベントがそのオブジェクトに作用することであると書かれていることもわかります。他のオブジェクトを削除できます。それはlistenToでもどのように実装されていますか?

ありがとう

4

1 に答える 1

4

これは の関数シグネチャですon:

object.on(イベント、コールバック、[コンテキスト])

event「クリック」のようなイベント名か、次のようなイベント マップのいずれかです。

{
    'click .button': 'handler1',
    'keydown': function(){}
}

したがって、listenTo投稿したコード内の最初の引数は、イベント名またはイベント マップです。イベント名 (タイプ "string") の場合は、指定されたコールバックを 2 番目のパラメーターとして on に渡します。nameがイベント マップ (タイプ「オブジェクト」) である場合、バックボーンがthis通過します。コールバックとして渡されたとしても、最終的にはコンテキストとして使用されます。

eventsApi関数と、それがどのように呼び出されるかを見てみましょうon:

function(obj, action, name, rest) {
    if (!name) return true;
    if (typeof name === 'object') {
      for (var key in name) {
        obj[action].apply(obj, [key, name[key]].concat(rest));
      }
    }
// ... code in `on`:
eventsApi(this, 'on', name, [callback, context]) && callback)

はイベント マップであると仮定nameします (したがってtypeof name ==='object'、真です)。イベント マップの各メンバーに対して、on次の引数を使用して呼び出します[key, name[key]].concat(rest)。なので、4 つの引数を取得しますrest[callback, context]

しかし、それは受け入れるよりも 1 つ多くon、最後の 1 つは . ではなくコンテキストである必要がありますcallbacklistenToがオブジェクトをコールバックとして渡しthis、イベント ハンドラーのコンテキストにするのはそのためです。

listenToはかなり新しいメソッドなので、変数名が意味をなさないのはそのためだと思います。


ビューが削除されると (おそらくモデルの削除後)、removeメソッドはstopListeningビューを呼び出します。off引数を渡さない場合、その関数はすべてのハンドラーを呼び出すだけです。

for (var id in listeners) {
    listeners[id].off(null, null, this);
}
于 2013-02-28T21:03:47.413 に答える