user4932805
user4932805

Reputation:

Backbone.js source code - eventsApi

The following is a snippet from the Backbone.js annotated source code:

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;
};

The eventsApi function checks for events as objects, in order to handle jQuery-style event maps.

But why does it call eventsApi recursively as it iterates through all the events?

Upvotes: 1

Views: 73

Answers (1)

T J
T J

Reputation: 43166

The iteratee in the above is the following:

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;
};

it registers an event for single attribute (name).

eventsApi checks if the second parameter is an object, in that case it calls itself to register events for all the properties of the object, for example the attributes object of a model. This is a common use of recursion.

Upvotes: 3

Related Questions