web-dev-qa-db-fra.com

Quels événements sont déclenchés lors de l'appel de fetch () sur une collection Backbone.js?

Dans mon application backbone.js, il y a un Trips collection Qui contient Trip models, Qui fonctionne avec LocalStorage. Je peux appeler Trips.create(form_attributes) pour créer et enregistrer un trajet vers le Todos store.

Lorsque je charge mon application pour la première fois, j'appelle Trips.fetch({ success: trips_fetch_success }) et trips_fetch_success Reçoit une réponse qui indique le Trip models Que contient le Trips collection.

J'ai essayé de lier les événements refresh et change au Trips collection, Mais ces événements ne sont pas interceptés, ce qui me fait croire que j'ai une idée erronée des événements Trips.fetch Déclenche.

Ma question: quels événements Trips.fetch Doit-il déclencher? Et les événements sont-ils déclenchés sur la collection ou sur chacun des individus Trip models?

68
Alan David Garcia

Collection.fetch() appellera reset en cas de succès, ce qui déclenchera à son tour un événement 'reset'. Tous les abonnés à l'événement de réinitialisation des collections doivent recevoir l'événement.

La clé ici est "sur le succès". J'ai eu ce problème, seulement pour découvrir que l'épine dorsale avalait silencieusement mes messages d'erreur. Passez un gestionnaire d'erreurs qui, au moins, se connecte à console.log(), et voyez ce qui se passe:

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

(Remarque: les anciennes versions de backbone.js déclencheront "rafraîchir" au lieu de "réinitialiser")

59
Elf Sternberg

Si vous utilisez backbone 1.0, vous devrez passer reset: true dans l'appel fetch () afin de vous lier à l'événement reset:

trips.fetch({reset: true});
52
jesal

Depuis le backbone 1.0, model.fetch () déclenche une "synchronisation". C'est à cela que vous devez vous lier.

Voici la partie pertinente de la source backbone.js où l'événement "sync" est déclenché:

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'S THE TRIGGER!
    model.trigger('sync', model, resp, options);

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