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
?
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")
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});
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);
},