Backbone.js: Collection.get () Themen
-
25-10-2019 - |
Frage
Mit Backbone.js versuchen Sie, ein einfaches Get () auf einer Sammlung nach dem Abholen von Elementen vom Server zu machen.
Fetch scheint gut zu funktionieren. Wenn ich jedoch versuche, einen Artikel per ID aus der Sammlung zu erhalten, erhalte ich das unerwartete Ergebnis von undefiniert anstelle eines Modells.
Hier ist mein Backbone -Element -Code:
Model.Scenario = Backbone.Model.extend({
defaults: function() {
return {
title: 'Scenario',
answer: null,
};
}
});
Collection.Scenarios = Backbone.Collection.extend({
model: Model.Scenario,
url: "data.php",
});
Dann die OBJ -Kreation/das Fetch mit einer Router -Methode:
var Router = new (Backbone.Router.extend({
routes: {
":id" : "page",
"" : "page"
},
initialize: function() {
_.bindAll(this, 'page');
this.scenarios = new Collection.Scenarios();
this.scenarios.fetch();
console.log(this.scenarios);
console.log(this.scenarios.get(1));
console.log(this.scenarios.get(2));
Backbone.history.start();
},
}))();
Schließlich ist hier das, was beim Debugger angemeldet ist (damit Sie sehen, dass die Sammlung besiedelt wird):
child
_byCid: Object
_byId: Object
1: child
2: child
3: child
4: child
7: child
10: child
11: child
12: child
13: child
14: child
15: child
16: child
17: child
18: child
19: child
20: child
21: child
22: child
23: child
26: child
27: child
28: child
__proto__: Object
length: 22
models: Array[22]
__proto__: ctor
undefined //first call to get(id)
undefined //2nd call to get(id)
Ich bin ratlos. Entschuldigung für den langen Beitrag, würde aber über jede Einsicht darüber schätzen, was mir fehlt. Vielen Dank.
Lösung
Mein erster Gedanke ist, dass der Fetch () nicht zurückgekehrt ist, wenn Sie Ihr .get () tun.
Aber wenn das, was Sie gepostet haben, genau das ist, was passiert, wird die erste Konsole (this.scenarios) angezeigt, die geladen wird.
Auf jeden Fall möchten Sie versuchen, die Konsole in den Erfolg zu bringen: Ereignis des Abrufs, nur um sicherzustellen, dass dies nicht das Problem ist.
Mein zweiter Gedanke ist, dass die ID für die Modelle nicht richtig eingestellt wird.
Backbone.model standardmäßig verwendet die Eigenschaft "ID" als ID für ein Modell, Collection.get (ID) gibt das Modell mit der ID zurück, die Sie übergeben haben.
Hat die Antwort von Data.php eine ID -Eigenschaft?
Versuchen Sie es stattdessen:
var Router = new (Backbone.Router.extend({
routes: {
":id" : "page",
"" : "page"
},
initialize: function() {
_.bindAll(this, 'page');
this.scenarios = new Collection.Scenarios();
this.scenarios.fetch({
success: function(coll, resp) {
console.log(coll);
console.log(coll.first());
console.log(coll.last());
});
Backbone.history.start();
},
}))();
Das sollte das erste und letzte Modell zurückgeben und das ID -Problem aus dem Bild herausnehmen.
Wenn das funktioniert, was zeigen die Modelle für die ID -Eigenschaft (Coll.First (). ID)?