Backbone.js: Collection.get () questions
-
25-10-2019 - |
Question
En utilisant Backbone.js, en essayant de faire un get simple () sur une collection après l'extraction des éléments du serveur.
Fetch semble fonctionner très bien. Cependant, lorsque je tente d'obtenir un article par id de la collection, je reçois le résultat inattendu de non défini, au lieu d'un modèle.
Voici mon épine dorsale code éléments:
Model.Scenario = Backbone.Model.extend({
defaults: function() {
return {
title: 'Scenario',
answer: null,
};
}
});
Collection.Scenarios = Backbone.Collection.extend({
model: Model.Scenario,
url: "data.php",
});
Alors la création obj / fetch w / dans une méthode de routeur:
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();
},
}))();
Enfin, voici ce qui est connecté au débogueur (vous pouvez voir la collection est peuplée):
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)
Je suis perplexe. Désolé pour le long post, mais apprécierait une idée sur ce que je suis absent. Merci.
La solution
Ma première pensée est que le fetch () n'a pas retourné au moment où vous faites votre .get ().
Mais, si ce que vous avez publié est exactement ce qui se passe, la première console.log (this.scenarios) montre que est chargé.
En tout cas, vous pouvez essayer de mettre les console.logs dans le succès: cas de récupération, juste pour vous assurer que n'est pas la question
.Ma deuxième pensée est que l'identifiant pour les modèles n'est pas défini droit.
par défaut Backbone.Model à l'aide de la propriété « id » comme ID pour un modèle, Collection.get (id) retourne le modèle avec l'ID que vous avez passé dans.
Alors, est la réponse de data.php ont une propriété id?
Essayez plutôt:
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();
},
}))();
Ce qui devrait renvoyer le premier et le dernier modèle, et de prendre la question d'identification de l'image.
Si cela fonctionne, qu'est-ce que les modèles montrent la propriété id (coll.first () id.)?