web-dev-qa-db-fra.com

Options de collection Backbone.js

J'ai écrit un modèle/vue/collection en utilisant Backbone.js. Ma collection utilise la méthode fetch pour charger les modèles à partir d'un serveur distant. L'URL requise pour cette collection a besoin d'un identifiant comme: messages/{id}. Mais je n'ai trouvé aucun moyen propre de transmettre des options à la collection.

La vue backbone.js accepte les options en la passant sur construction: view ([options]), mais la collection attend une liste de modèles lors de la construction: collection ([models]).

Quelle est la façon la plus "propre" de transmettre des paramètres/options à cette collection?

Code raccourci:

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

@ La réponse de Paul est bonne, mais il convient également de noter que l'attribut url peut être une fonction. À mon avis (et c'est juste une opinion, car le résultat final est le même), le code est un peu plus lisible, s'il est plus détaillé, si vous définissez l'ID dans initialize et la référencez-le dans une fonction:

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();

Juste pour être sûr, cependant - vous ne confondez pas le id ici avec le modèle id, n'est-ce pas? @ La réponse de Paul et mon code ci-dessus supposent que vous avez plusieurs collections Messages, chacune avec son propre identifiant. Si le chemin de l'API /messages/<id> fait en fait référence à un message, pas à un ensemble de messages, il vous suffit de définir url sur /messages/ dans la collection, et Backbone utilisera automatiquement /messages/<id> pour chaque modèle.

108
nrabinowitz

De la façon dont vous avez déclaré la propriété url, la valeur sera déterminée une fois lorsque le navigateur chargera initialement le fichier javascript et "id" ne sera pas défini.

Le Backbone.Collection accepte les options comme deuxième argument de son constructeur, vous pouvez donc passer la valeur id en tant qu'option, puis définir la valeur url dans la fonction d'initialisation de la collection.

Voici un exemple

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