44 votes

Les options de collection de 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 depuis un serveur distant. L'URL requise pour cette collection nécessite un id comme: messages/{id}. Mais je n'ai trouvé aucun moyen propre de passer des options à la Collection.

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

Quel est le moyen le plus "propre" de passer des paramètres/options à cette collection ?

Code raccourci :

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

108voto

nrabinowitz Points 27991

La réponse de @Paul est bonne, mais il convient de noter que l'attribut url peut également être une fonction. À mon avis (et ce n'est qu'un avis, car le résultat final est le même), le code est un peu plus lisible, bien que plus verbeux, si vous définissez l'identifiant dans initialize et que vous le référencez 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();

Pour être sûr, cependant - vous ne confondez pas l'id ici avec l'id du modèle, 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 d'API /messages/ fait en réalité référence à un message, et non à un ensemble de messages, alors vous n'avez qu'à définir l'url sur /messages/ dans la Collection, et Backbone utilisera automatiquement /messages/ pour chaque modèle.

23voto

Paul Points 6185

La façon dont vous avez déclaré la propriété de l'url, la valeur sera déterminée une fois lorsque le navigateur charge initialement le fichier javascript, et 'id' sera indéfini.

Le Backbone.Collection accepte des options en tant que deuxième argument dans son constructeur, vous pouvez donc passer la valeur id comme option, puis définir la valeur de l'url dans la fonction initialize 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();

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X