Какие события вызывают при вызове fetch() в коллекции Backbone.js?

В моем приложении backbone.js есть Trips collection, который содержит Trip models, который работает с LocalStorage. Я могу вызвать Trips.create(form_attributes) для создания и сохранения поездки в Todos store.

Когда я впервые загружаю свое приложение, я вызываю Trips.fetch({ success: trips_fetch_success }), а trips_fetch_success получает ответ, который показывает Trip models, что имеет место Trips collection.

Я попытался связать события refresh и change с Trips collection, но эти события не пойманы, заставив меня поверить, что у меня неправильное представление о том, какие события Trips.fetch запускаются.

Мой вопрос: какие события должны срабатывать Trips.fetch? И происходят ли события в коллекции или на каждом из отдельных Trip models?

Ответ 1

Collection.fetch() будет называть reset успешным, что, в свою очередь, вызовет событие 'reset. Любые подписчики коллекции reset должны получить событие.

Ключевым моментом здесь является "об успехе". У меня была эта проблема, только чтобы обнаружить, что позвоночник молча проглотил мои сообщения об ошибках. Передайте обработчик ошибок, который, по крайней мере, записывается в console.log() и видит, что происходит:

trips.fetch({error: function() { console.log(arguments); }});

(Примечание: старые версии backbone.js вызывают "обновление" вместо "reset" )

Ответ 2

Если вы используете backbone 1.0, вам нужно передать reset: true в вызове fetch(), чтобы связать с событием reset:

trips.fetch({reset: true});

Ответ 3

Начиная с магистральной версии 1.0, model.fetch() запускает "синхронизацию". Это то, что вы должны связать.

Вот соответствующая часть из источника backbone.js, где происходит событие sync:

fetch: function(options) {
  options = options ? _.clone(options) : {};
  if (options.parse === void 0) options.parse = true;
  var model = this;
  var success = options.success;
  options.success = function(resp) {
    if (!model.set(model.parse(resp, options), options)) return false;
    if (success) success(model, resp, options);

    // HERE THE TRIGGER!
    model.trigger('sync', model, resp, options);

  };
  wrapError(this, options);
  return this.sync('read', this, options);
},