Tengo un modelo de red troncal llamado Member
, que contiene datos de membresía como nombre, apellido, correo electrónico, teléfono, etc. También incluye campos de valores múltiples que debo conservar como colecciones; estos son Degrees
y Affiliations
.¿Cómo puedo implementar correctamente el análisis sintáctico en un modelo Backbone para incluir colecciones?
El problema con el que me estoy encontrando al llamar al método fetch()
en mi modelo es que hay una desigualdad de impedancia de tipo entre una matriz básica y los objetos de colección que tengo en mi modelo. Como se supone que parse
por definición devuelve un hash para usar en set
en lugar de establecer valores, me es imposible establecer mis colecciones de esta manera. Por ejemplo, si devuelvo un objeto de JavaScript para Degrees
que se parece a lo siguiente: {degrees: [{id: 1, title: "PhD"}]}
, esto convierte mi colección degree
en una matriz plana. Aquí está mi código:
window.Models.Member = Backbone.Model.extend({
url: '/api/member',
initialize: function() {
_.bindAll(this);
this.set('degrees', new window.Collections.DegreesList());
this.fetch();
},
parse: function(response) {
var setHash = {};
setHash.first_name = response.first_name;
setHash.last_name = response.last_name;
setHash.office_phone = response.office_phone;
// When this is run, this.get('degrees') will now return a flat array rather than a DegreesList collection
setHash.degrees = _(response.degrees).each(function(item) {
return {id: item.id, title: item.title}
});
return setHash;
}
});
pude configurar manualmente las colecciones en mi función de análisis, pero que parece que es subvertir la forma en la espina dorsal, y hacky.
EDIT: He resuelto el problema temporalmente de la siguiente manera:
parse: function(response) {
var setHash = {};
setHash.first_name = response.first_name;
setHash.last_name = response.last_name;
setHash.office_phone = response.office_phone;
this.get('degrees').reset(response.degrees);
return setHash;
}
Dudo que esto es la solución óptima, pero ciertamente funciona por ahora. Estoy abierto a mejores sugerencias.
Prueba esto: Pasa de la 'de análisis:' función (que doesn parece ser necesario), y en su lugar dentro de 'initialize: 'transforma manualmente el atributo' degrees' de una matriz en una colección Backbone ... –
'parse' se llama automáticamente una vez que el método' fetch' regresa. Podría restablecer manualmente el atributo 'degrees' de nuevo a una colección después de llamar a 'fetch', pero entonces no tendría ninguno de los datos en esa colección que quiero ... y los datos están entrando. – rybosome
Tendría hacer muchas cosas con 'degrees' si las agregas manualmente en el' parse'. Vaya con la sugerencia de @ ŠimeVidas y use una colección Backbone para ellos. Te permite tratar con cada 'grado' la forma de Backbone. – sntran