Ich habe ein Clock
Modell in Backbone:
var Clock = Backbone.Model.extend({});
Ich versuche, eine Instanz davon zu erhalten, die die neuesten Informationen aus /clocks/123
Enthält. Einige Dinge, die ich ausprobiert habe:
Clock.fetch(123)
// TypeError: Object function (){ ... } has no method 'fetch'
fetch
:c = new Clock({id: 123})
c.fetch()
// Error: A 'url' property or function must be specified
Ich habe versucht, eine AllClocks
-Auflistungsressource zu erstellen (obwohl ich für so etwas auf der Seite keine Verwendung habe):
var AllClocks = Backbone.Collection.extend({
model: Clock,
url: '/clocks/'
});
var allClocks = new AllClocks();
allClocks.fetch(123);
// returns everything from /clocks/
Wie bekomme ich einfach eins API-unterstützte Uhr?
Ihr zweiter Ansatz ist der Ansatz, den ich verwendet habe. Fügen Sie Ihrem Uhrenmodell Folgendes hinzu:
url : function() {
var base = 'clocks';
if (this.isNew()) return base;
return base + (base.charAt(base.length - 1) == '/' ? '' : '/') + this.id;
},
Dieser Ansatz setzt voraus, dass Sie Controller mit dem Hashbang in Ihrer URL implementiert haben, http://www.mydomain.com/#clocks/12 , aber er sollte funktionieren, auch wenn Sie dies noch nicht getan haben .
Versuchen Sie, rlRoot im Modell anzugeben:
Aus den Dokumenten:
var Book = Backbone.Model.extend({urlRoot : '/books'});
var solaris = new Book({id: "1083-lem-solaris"});
solaris.fetch();
Ich persönlich empfehle, die Model # url method documentation zu befolgen
model = new Model(id: 1)
view = new View(model: model)
collection = new Collection([model])
model.fetch()
denken Sie in Ihrer Sammlung daran, die Sammlungs-URL hinzuzufügen:
url: "/models"
führen Sie in der Initialisierungsfunktion Ihrer Ansicht folgende Schritte aus:
this.model.bind("change", this.render)
auf diese Weise führt Backbone eine Ajax-Anfrage unter Verwendung der folgenden URL aus:
"/models/1"
ihr Modell wird aktualisiert und die Ansicht gerendert, ohne die Collection # url oder Model # urlRoot zu ändern
hinweis: Entschuldigung, dieses Beispiel wurde in einem Kaffeeskript erstellt, aber Sie können es leicht in js übersetzen, indem Sie var-Anweisungen hinzufügen
var Person = Backbone.Model.extend({urlRoot : '/person/details'});
var myName = new Person({id: "12345"});
myName.fetch();
Als Ergebnis stellen Sie eine Ajax-Anfrage an die
URL http://[domainName]/person/details/id
und Sie haben die JSON-Antwort zurück.
Enjoiiii !!!
Ich möchte RESTful-URL verwenden, konnte jedoch nicht nachvollziehen, warum "postId" nicht zur Basis-URL hinzugefügt werden kann.
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());
Dann weiß ich erst, nachdem ich in Model 'idAttribute' als 'postId' festgelegt habe, dass ich die richtige URL bekomme. so was:
var PostModel = Backbone.Model.extend({
idAttribute: 'postId',
urlRoot: 'getBlogPost',
defaults: {
postTitle: "defaultTitle",
postTime: "1970-01-01",
postContent: "defaultContent",
postAuthor: "anonymous"
}
});
Sie sollten wahrscheinlich über eine Sammlung auf das Objekt zugreifen und es die ganze Zeit in der Sammlung behalten. So geht's:
var AllClocks = Backbone.Collection.extend({
model: Clock,
url: '/clocks/'
});
var allClocks = new AllClocks();
my_clock = allClocks.add({id: 123});
my_clock.fetch()
... und mach das, wenn du keinen abschließenden Schrägstrich auf dem Modell urlRoot haben willst:
url : function() {
return this.urlRoot + this.id;
},