wake-up-neo.com

Wie rufe ich ein einzelnes Modell in Backbone ab?

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:

eine "Klasse" -Ebene Methode

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

erstellen einer Instanz und anschließender Aufruf von fetch:

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

eine Sammlung

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?

93
James A. Rosen

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 .

26

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();
137
Hernan S.

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

26
makevoid
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 !!!

12
Ankit Garg

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"
    }
});
0
Araell

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()
0
ssobczak

... und mach das, wenn du keinen abschließenden Schrägstrich auf dem Modell urlRoot haben willst:

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