web-dev-qa-db-fra.com

Comment récupérer un seul modèle dans Backbone?

J'ai un modèle Clock dans Backbone:

var Clock = Backbone.Model.extend({});

J'essaie d'obtenir une instance contenant les informations les plus récentes de /clocks/123. Certaines choses que j'ai essayées:

une méthode de niveau "classe"

Clock.fetch(123)
// TypeError: Object function (){ ... } has no method 'fetch'

créer une instance puis appeler fetch dessus:

c = new Clock({id: 123})
c.fetch()
// Error: A 'url' property or function must be specified

une collection

J'ai essayé de créer une ressource de collection AllClocks (même si je n'ai aucune utilité pour une telle chose sur la page):

var AllClocks = Backbone.Collection.extend({
  model: Clock,
  url: '/clocks/'
});
var allClocks = new AllClocks();
allClocks.fetch(123);
// returns everything from /clocks/

Comment puis-je obtenir simplement n Horloge basée sur une API?

93
James A. Rosen

Votre deuxième approche est celle que j'ai utilisée. Essayez d’ajouter ce qui suit à votre modèle Clock:

url : function() {
  var base = 'clocks';
  if (this.isNew()) return base;
  return base + (base.charAt(base.length - 1) == '/' ? '' : '/') + this.id;
},

Cette approche suppose que vous avez implémenté des contrôleurs avec le hashbang dans votre URL, comme ceci, http://www.mydomain.com/#clocks/12 , mais cela devrait fonctionner même si vous ne l'avez pas encore .

26
Andrew De Andrade

Essayez de spécifier rlRoot dans le modèle:

De la docs:

var Book = Backbone.Model.extend({urlRoot : '/books'});
var solaris = new Book({id: "1083-lem-solaris"});
solaris.fetch();
137
Hernan S.

Je recommande personnellement, en suivant le documentation de la méthode du modèle # url

model = new Model(id: 1)
view = new View(model: model) 
collection = new Collection([model])
model.fetch()

dans votre collection, n'oubliez pas d'ajouter l'URL de la collection:

url: "/models"

et dans la fonction d'initialisation de votre vue, faites:

this.model.bind("change", this.render)

ainsi, backbone fera une requête ajax en utilisant cette URL:

"/models/1"

votre modèle sera mis à jour et la vue restituée, sans modifier Collection # url ou Model # urlRoot

note: désolé, cet exemple est sorti dans coffee script, mais vous pouvez facilement le traduire en js en ajoutant des instructions var

26
makevoid
var Person = Backbone.Model.extend({urlRoot : '/person/details'});
var myName = new Person({id: "12345"});
myName.fetch();

Par conséquent, vous faites une demande Ajax sur le

URL http://[domainName]/person/details/id 

et vous avez la réponse JSON de retour.

Enjoiiii !!!

12
Ankit Garg

Je souhaite utiliser l'URL RESTful, mais je ne comprends pas pourquoi "postId" ne peut pas être ajouté à l'URL de base.

var PostModel = Backbone.Model.extend({
    urlRoot: 'getBlogPost',
    defaults: {
        postTitle: "defaultTitle",
        postTime: "1970-01-01",
        postContent: "defaultContent",
        postAuthor: "anonymous"
    }
});

var post = new PostModel({
            postId: 1
        });
alert(post.url());

Ensuite, je ne peux obtenir l'URL correcte qu'après avoir défini "idAttribute" comme "postId". comme ça:

var PostModel = Backbone.Model.extend({
    idAttribute: 'postId',
    urlRoot: 'getBlogPost',
    defaults: {
        postTitle: "defaultTitle",
        postTime: "1970-01-01",
        postContent: "defaultContent",
        postAuthor: "anonymous"
    }
});
0
Araell

Vous devriez probablement accéder à l'objet via une collection et le conserver dans la collection tout le temps. Voici comment le faire:

var AllClocks = Backbone.Collection.extend({
  model: Clock,
  url: '/clocks/'
});

var allClocks = new AllClocks();
my_clock = allClocks.add({id: 123});
my_clock.fetch()
0
ssobczak

... et faites ceci si vous ne voulez pas la barre oblique finale sur le modèle urlRoot:

    url : function() {                        
        return this.urlRoot + this.id;
    },
0
4m1r