Backbone.js: Collection.get () problemas
-
25-10-2019 - |
Pregunta
Usando BackBone.js, tratando de hacer un simple Get () en una colección después de obtener elementos del servidor.
Fetch parece funcionar bien. Sin embargo, cuando trato de obtener un elemento por identificación de la colección, obtengo el resultado inesperado de indefinido, en lugar de un modelo.
Aquí está el código de los elementos de la columna vertebral:
Model.Scenario = Backbone.Model.extend({
defaults: function() {
return {
title: 'Scenario',
answer: null,
};
}
});
Collection.Scenarios = Backbone.Collection.extend({
model: Model.Scenario,
url: "data.php",
});
Entonces la creación/búsqueda de obj con un método de enrutador:
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();
},
}))();
Finalmente, esto es lo que está registrado para el depurador (para que pueda ver que la colección está siendo poblada):
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)
Estoy perplejo. Perdón por la larga publicación, pero agradecería cualquier idea de lo que me estoy perdiendo. Gracias.
Solución
Mi primer pensamiento es que el Fetch () no ha regresado cuando esté haciendo su .get ().
Pero, si lo que publicaste es exactamente lo que está sucediendo, entonces la primera consola.log (this.scenarios) muestra que está cargado.
En cualquier caso, es posible que desee intentar poner la consola.logs en el éxito: Evento de la búsqueda, solo para asegurarse de que ese no sea el problema.
Mi segundo pensamiento es que la identificación para los modelos no se está configurando correctamente.
Backbone.Model es predeterminado que usa la propiedad "ID" como ID para un modelo, Collection.get (ID) Devuelve el modelo con la ID que pasó.
Entonces, ¿la respuesta de data.php tiene una propiedad de identificación?
Intente en su lugar:
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();
},
}))();
Que debería devolver el primer y último modelo, y sacar el problema de identificación de la imagen.
Si eso funciona, ¿qué muestran los modelos para la propiedad ID (coll.first (). Id)?