2017-07-02 3 views
1

Backbone.js注釈付きソースコードからの抜粋です:BACKBONE.JSソースコード - eventsApi

var eventsApi = function(iteratee, events, name, callback, opts) { 
    var i = 0, names; 
    if (name && typeof name === 'object') { 

    if (callback !== void 0 && 'context' in opts && opts.context === void 0) opts.context = callback; 
    for (names = _.key(names); i < names.length; i++) { 
     events = eventsApi(iteratee, events, names[i], name[names[i]], opts); 
    } 
    } else if (name && eventSplitter.test(name)) { 
    for (names = name.split(eventSplitter); i < names.length; i++) { 
     events = iteratee(events, names[i], callback, opts); 
    } 
    } else { 
    events = iteratee(events, name, callback, opts); 
    } 
    return events; 
}; 

オブジェクトなどのイベントのためeventsApi機能をチェックし、jQueryのスタイルのイベントマップを処理するためです。

しかし、なぜそれがすべてのイベントを反復するので、再帰的にeventsApiを呼び出しますか?上記で

答えて

2

iterateeは以下の通りである:

var onApi = function(events, name, callback, options) { 
    if (callback) { 
    var handlers = events[name] || (events[name] = []); 
    var context = options.context, ctx = options.ctx, listening = options.listening; 
    if (listening) listening.count++; 
    handlers.push({callback: callback, context: context, ctx: context || ctx, listening: listening}); 
    } 
    return events; 
}; 

それは単一の属性(name)のためにイベントを登録します。

eventsApiは、2番目のパラメータがオブジェクトであるかどうかをチェックします。その場合、モデルのattributesオブジェクトなど、オブジェクトのすべてのプロパティのイベントを登録するために自身を呼び出します。これは再帰の一般的な使用です。