web-dev-qa-db-fra.com

Comment définir l'URL d'une collection

disons que j'ai:

var Book = Backbone.Model.extend();

var Collection = Backbone.Collection.extend({
  model: Book,
  url: '/books',
  initialize: function(){
    this.fetch();
  })
})

Comment puis-je modifier les Collectionurl lors de l'instanciation d'une nouvelle collection?

var AdventureBooks = new Books({ url: '/books/adventure' }) ne fonctionne pas

var AdventureBooks = new Books({ category: 'adventure' })

et dans la définition de Collection:

url : '/books/' + this.category Ne fonctionne pas non plus.

Merci.

35
Running Turtle
var Book = Backbone.Model.extend({
  "url": function() {
    return '/books/' + this.get("category");
  }
});
28
Raynos

Les éléments suivants devraient fonctionner:

var AdventureBooks = new Books();
AdventureBooks.url = '/books/adventure';
39
ponzao

Pour une raison quelconque, les paramètres passés au constructeur Collection (par exemple "url") ne sont pas définis sur l'objet. La collection n'en utilise que peu (modèle et comparateur).

Si vous souhaitez passer l'URL via le constructeur, vous devez créer une méthode d'initialisation qui copie les paramètres nécessaires dans l'objet:

var Book = Backbone.Model.extend({
    initialize: function(props) { 
        this.url = props.url;
    }
}
var book = new Book({url: "/books/all"});
13
Juha Palomäki

Comme Daniel Patz souligné , le problème réside dans la façon dont vous instanciez la collection. Je me suis juste débattu avec cela un peu en ce moment, alors j'ai pensé mettre à jour cela, même si la question est un peu ancienne.

Le premier argument devrait être un tableau de modèles, avec les options à venir. Cela devrait fonctionner:

var AdventureBooks = new Books([], { url: '/books/adventure' })

Si vous voulez une URL dynamique, la réponse de Raynos pourrait être la voie à suivre.

9
Ruy Diaz

Si vous souhaitez avoir des URL dynamiques pour votre collection, essayez ceci (testé avec backbone 1.1.2):

Créez une instance de votre collection de dorsale et passez le paramètre d'URL dynamique en option (l'objet options doit être le deuxième argument car le premier est un tableau facultatif de modèles):

var tweetsCollection = new TweetsCollection(null, { userId: 'u123' });

Ensuite, à l'intérieur de votre collection, créez une fonction d'URL dynamique qui utilise la valeur de l'objet options:

var TweetsCollection = Backbone.Collection.extend({
    url: function() {
        return '/api/tweets/' + this.options.userId;
    },
    model: TweetModel
});
3
chrisweb

La meilleure solution pour moi est la méthode d'initialisation, regardez cet exemple:

Entities.MyCollection = Backbone.Collection.extend({
    model: Entities.MyModel,
    initialize: function(models,options) { 
        this.url = (options||{}).url || "defaultURL";
    },
}

utilisez-le comme suit:

var items = new Entities.MyCollection();                     //default URL
var items = new Entities.MyCollection([],{url:'newURL'});    //changed URL
2
Pavel Sedek

Je sais que c'est une réponse tardive, mais j'ai eu une situation similaire bien que légèrement plus compliquée, et la réponse sélectionnée ne m'a pas vraiment aidé.

J'ai une collection Conditions, et chaque modèle d'expérience a plusieurs conditions, et j'avais besoin que mon URL soit/api/experiences /: experimentId/conditions, mais je ne savais pas comment accéder à experimentId à partir de la collection Conditions vide.

Dans ma fonction d'URL de collecte de conditions, j'ai créé un fichier console.log (this.toJSON ()) et j'ai découvert que Backbone insère un modèle factice unique dans la collection vide avec les attributs que vous avez transmis au moment de la création.

donc:

var Conditions = new ConditionsCollection({
  experimentId: 1
});

Je doute que cela soit considéré comme une meilleure pratique, j'espère que quelqu'un d'autre répondra avec une meilleure solution, mais voici comment j'ai défini ma collection:

var ConditionsCollection = Backbone.Collection.extend({
  model: Condition,
  url:  function(){
    var experimentId = this.at(0).get("experimentId");
    return "/api/experiments/" + experimentId + "/conditions";
  }
});
1
ckot

Ce travail pour moi (testé avec backbone 1.2.1):

var serverData = Backbone.Collection.extend({
url: function() {
    return '//localhost/rest/' + this.dbname;
},
constructor: function(a) {
    if(a.dbname){
        this.dbname = a.dbname;
    }
    Backbone.Collection.apply(this, arguments);
}
});

utilisez-le comme suit:

var users = new serverData({dbname : 'users'});
0
Pavel B