webentwicklung-frage-antwort-db.com.de

Optionen für die Auflistung von Backbone.js

Ich habe ein Modell/eine Ansicht/eine Sammlung mit Backbone.js geschrieben. Meine Sammlung verwendet die Abrufmethode, um die Modelle von einem Remoteserver zu laden. Die für diese Sammlung erforderliche URL benötigt eine ID wie: messages/{id}. Aber ich habe keine saubere Möglichkeit gefunden, Optionen an die Sammlung weiterzugeben.

Die Ansicht backbone.js akzeptiert Optionen, indem sie an construction: view ([options]) übergeben wird. Die Auflistung erwartet jedoch eine Liste der Modelle bei der Erstellung: collection ([models]).

Was ist die "sauberste" Methode, um Parameter/Optionen an diese Sammlung zu übergeben?

Verkürzter Code:

var Messages = Backbone.Collection.extend({
 model: Message,
   url: 'http://url/messages/' + id
});
44
Jens

@ Pauls Antwort ist gut, aber es ist auch erwähnenswert, dass das url -Attribut eine Funktion sein kann. Meiner Meinung nach (und es ist nur meine Meinung, da das Endresultat dasselbe ist) ist der Code ein wenig besser lesbar, wenn Sie die ID in initialize setzen und in einer Funktion darauf verweisen:

var Messages = Backbone.Collection.extend({
  initialize: function(models, options) {
    this.id = options.id;
  },
  url: function() {
    return '/messages/' + this.id;
  },
  model: Message,
});

var collection = new Messages([], { id: 2 });
collection.fetch();

Nur um sicherzugehen, dass Sie das id hier nicht mit dem Modell id verwechseln, oder? Bei der Antwort von @ Paul und meinem obigen Code wird davon ausgegangen, dass Sie über mehrere Messages Sammlungen mit jeweils einer eigenen ID verfügen. Wenn der API-Pfad /messages/<id> bezieht sich eigentlich auf ein Nachricht, nicht auf eine Reihe von Nachrichten, dann müssen Sie nur url auf /messages/ in der Sammlung und Backbone verwendet automatisch /messages/<id> für jedes Modell.

108
nrabinowitz

Wie Sie die Eigenschaft url deklariert haben, wird der Wert einmalig beim ersten Laden der Javascript-Datei durch den Browser ermittelt, und 'id' ist undefiniert.

Die Backbone.Collection akzeptiert Optionen als zweites Argument in ihrem Konstruktor, sodass Sie den ID-Wert als Option übergeben und dann den URL-Wert in der Initialisierungsfunktion der Auflistung festlegen können.

Hier ist ein Beispiel

var Messages = Backbone.Collection.extend({
  initialize: function(models, options) {
    this.url = 'http://url/messages/' + options.id;
  },
  model: Message,
});

var collection = new Messages([], { id: 2 });
collection.fetch();
23
Paul