Welche Ereignisse werden beim Aufrufen von fetch () in einer Backbone.js-Auflistung ausgelöst?

68

In meiner backbone.js App gibt es eine Trips collection, die gilt Trip modelsund mit der funktioniert LocalStorage. Ich kann anrufen Trips.create(form_attributes), um eine Reise zum zu erstellen und zu speichern Todos store.

Wenn ich meine App zum ersten Mal lade, rufe ich an Trips.fetch({ success: trips_fetch_success })und trips_fetch_successerhalte eine Antwort, die zeigt, Trip modelsdass die App Trips collectionhält.

Ich habe versucht , zu binden refreshund changeEreignisse an die Trips collection, aber diese Ereignisse nicht erwischt zu werden, mich zu machen glauben , dass ich die falsche Vorstellung darüber , welche Ereignisse haben Trips.fetchTrigger.

Meine Frage: Welche Ereignisse sollen Trips.fetchauslösen? Und werden die Ereignisse in der Sammlung oder in jedem Einzelnen ausgelöst Trip models?

Alan David Garcia
quelle

Antworten:

59

Collection.fetch()ruft den resetErfolg auf, was wiederum ein 'Reset'-Ereignis auslöst. Alle Abonnenten des Ereignisses zum Zurücksetzen der Sammlungen sollten das Ereignis erhalten.

Der Schlüssel hier ist "auf Erfolg". Ich hatte dieses Problem, nur um festzustellen, dass das Backbone meine Fehlermeldungen lautlos verschluckte. Übergeben Sie einen Fehlerbehandler, der sich zumindest anmeldet console.log(), und sehen Sie, was passiert:

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

(Hinweis: Alte Versionen von backbone.js lösen "Aktualisieren" anstelle von "Zurücksetzen" aus.)

Elf Sternberg
quelle
4
Sie können einen globalen jQuery Ajax-Fehlerhandler verwenden, um Fehler dieser Art zu behandeln, die normalerweise mit Verbindungsproblemen zusammenhängen.
Julien
9
Als Rückgrat 0,5+, Collection#refresh wurde umbenannt zu Collection#reset. Die Veranstaltung wird ebenfalls entsprechend umbenannt.
Ejel
1
Es ist auch nützlich zu wissen, dass der resetRückruf zwei Standardargumente enthält "reset" (collection, options)und ausgelöst wird, wenn der gesamte Inhalt der Sammlung ersetzt wurde. "
Alan David Garcia
52

Wenn Sie Backbone 1.0 verwenden, müssen Sie reset: true im Aufruf von fetch () übergeben, um eine Bindung mit dem Reset-Ereignis herzustellen:

trips.fetch({reset: true});
Jesus
quelle
6
guter Punkt. Wenn ich eine Ansicht basierend auf einem Modell fetch () aktualisieren möchte, binde ich an 'sync'. Dies wird standardmäßig in 1.0 ausgelöst.
Perry Tew
20

Ab Backbone 1.0 löst model.fetch () eine 'Synchronisation' aus. Daran sollten Sie sich binden.

Hier ist der relevante Teil aus der Quelle backbone.js, in dem das 'Sync'-Ereignis ausgelöst wird:

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);
},
Perry Tew
quelle
2
das ist übrigens der eigentliche Code aus der Quelle backbone.js. Ich habe gerade meinen Kommentar noch einmal gelesen und mich gefragt, was der Code selbst war ... Besser explizit.
Perry Tew