backbone.js collection.get(id) devolviendo indefinido
Frecuentes
Visto 4,975 veces
1
Estaba teniendo problemas con idAttribute que causaban que .save() informara un valor incorrecto de isNew() cuando quería agregar un nuevo modelo al servidor con el ID rellenado previamente... lo que me llevó a mantenerlo apagado y establecer el model.id a mano.
Aquí está mi vista:
RecordListItemView = Backbone.View.extend({
initialize:function () {
var record = this.model.attributes;
if (record.user_id) {
this.model.id = parseInt( record.user_id );
record.id = parseInt( record.user_id );
// Added this so ID would show up in model and .attributes
}
this.model.bind("change", this.render, this);
this.model.bind("destroy", this.close, this);
},
render:function (eventName) {
$(this.el).html(this.template(this.model));
console.log(this);
return this;
}
});
En este punto, no puedo recuperar ningún registro usando collection.get(id), aunque puedo hacerlo a través de collection.getByCid(cid) sin problemas.
Aquí está mi salida de console.log:
d
$el: e.fn.e.init[1]
cid: "view36"
el: HTMLLIElement
model: d
_callbacks: Object
_escapedAttributes: Object
_pending: Object
_previousAttributes: Object
_silent: Object
attributes: Object
id: 15
user_id: "15"
user_name: "Test"
__proto__: Object
changed: Object
cid: "c8"
collection: d
id: 15
__proto__: x
options: Object
__proto__: x
¿Hay alguna manera de arreglar collection.get(id) sin tener que modificar mi base de datos para incluir un campo de identificación? (Actualmente usando user_id como el pk)
Como se publica a continuación por Benjamin Cox: (con parseInt() eliminado como innecesario)
Replace
this.model.id = record.user_id;
con
this.model.set({ id: record.user_id });
.. para evitar pasar por alto el evento de cambio del modelo que, a su vez, actualiza la matriz internal_byId[] de la colección.
Después de probar ambos, terminé usando mu is too short's parse
sugerencia..
parse: function(response) {
return {
id: response.user_id,
user_id: response.user_id,
user_name: response.user_name
};
}
1 Respuestas
2
La razón por la que llamar a collection.get(id) no encuentra su modelo es que está pasando por alto el mecanismo de eventos de Backbone cuando lo hace:
this.model.id = parseInt( record.user_id );
Si haces esto en su lugar:
this.model.set({ id: parseInt(record.user_id)});
luego, el código del evento Backbone en el método set() del modelo activará un evento "cambio: id". La colección, a su vez, escucha este evento y actualiza su variable de matriz interna _byId[]. Más tarde, cuando llama a collection.get(id), esta matriz se usa para buscar el modelo coincidente.
contestado el 03 de mayo de 12 a las 21:05
No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas collections view backbone.js or haz tu propia pregunta.
Añadiendo un
parse
implementación para copiaruser_id
aid
cuando obtener desde el servidor también podría ser una buena idea. - mu es demasiado cortoBenjamin: eso tiene mucho sentido, lo probaré tan pronto como llegue a la oficina mañana. Mu - Tendré que investigar
parse
para eso, pero me sentiría mucho mejor usando métodos de backbone en lugar de piratear los datos en su lugar. Gracias a los dos. - RosseynGracias a ambos por sus sugerencias, ¡limpiaron las cosas muy bien! - Rosseyn