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:
Clock.fetch(123)
// TypeError: Object function (){ ... } has no method 'fetch'
fetch
dessus:c = new Clock({id: 123})
c.fetch()
// Error: A 'url' property or function must be specified
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?
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 .
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();
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
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 !!!
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"
}
});
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()
... et faites ceci si vous ne voulez pas la barre oblique finale sur le modèle urlRoot:
url : function() {
return this.urlRoot + this.id;
},