2012-02-29 12 views
5

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.

+4

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 ... –

+0

'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

+0

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

Respuesta

2

Uso exactamente la misma solución que usted propone, excepto con algunos cambios.

  1. para evitar malentendidos que llamo la colección en el JSON: degreesData
  2. En el initialize puedo crear la colección de esta manera: this.degrees = new Degrees().reset(this.get("degreesData"));
+0

Lo siento por desenterrar viejas preguntas, pero ¿cómo se puede obtener degreesData desde el interior? Inicialice las ejecuciones cuando crea una instancia del modelo. DegressData no se completará hasta después de que obtenga, lo que debe realizar DENTRO de la inicialización. – raynjamin

+0

@raynjamin lo que llenó en la inicialización es la colección 'degrees' no el atributo' degreesData'. El atributo 'degreesData' viene como parte del JSON inicial que se utiliza para inicializar el Modelo, por lo que esta información está disponible en' initialize() '. _ (Si recuerdo bien) _ – fguillen

+0

Desenterrando esto de nuevo, ¿qué sucede si necesita inicializar un modelo vacío? Tendrás que comenzar a codificar en los valores predeterminados y esas cosas. Tal vez analizar es una mejor opción, al menos está (casi) garantizado tener datos en ese punto. – backdesk

Cuestiones relacionadas