これは の関数シグネチャです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 つは . ではなくコンテキストである必要がありますcallback
。listenTo
がオブジェクトをコールバックとして渡しthis
、イベント ハンドラーのコンテキストにするのはそのためです。
listenTo
はかなり新しいメソッドなので、変数名が意味をなさないのはそのためだと思います。
ビューが削除されると (おそらくモデルの削除後)、remove
メソッドはstopListening
ビューを呼び出します。off
引数を渡さない場合、その関数はすべてのハンドラーを呼び出すだけです。
for (var id in listeners) {
listeners[id].off(null, null, this);
}