2011-09-02 13 views
25

¿Es posible anidar colecciones dentro de los modelos?Backbone - Colecciones anidadas en los modelos

Sé que puede crear nuevas colecciones en la devolución de llamada de inicialización de un modelo y crear referencias que puede pasar de la colección al modelo principal. Sin embargo, es posible establecer la colección, como parte del modelo, de forma que el JSON que exporta es el siguiente:

{ 
    blah: 'blah', 
    myCollection: [ 
     { 
     foo: 'asdf', 
     bar: 'qwer' 
     }, 
     { 
     foo: 'asdf123', 
     bar: 'qwer123' 
     } 
    ] 
} 

Si no es así, ¿cómo manejar la sincronización de un modelo con cobros relacionados con el back-end? ¿Debes acceder a la sincronización de la red troncal y reconstruir el JSON o hay algo más integrado?

Lo sentimos si esta pregunta ha sido respondida en otro lugar. He mirado alrededor y he visto algunas soluciones, pero nada que realmente responda a lo que estoy buscando.

Respuesta

30

Hay dos enfoques. El primero es definir un Modelo raíz que obtenga todo. Usted anula su método parse() para crear subcolecciones y submodelos para atributos anidados, y anula el método toJSON() para convertir de nuevo a la estructura JSON, adecuada para guardar en el servidor.

Esto es perfectamente aceptable para pequeñas subcolecciones. Se necesita un poco de programación, pero si puede leer el código fuente de Backbone, cómo hacerlo debería ser, bueno, no obvio, pero al menos comprensible.

O puede usar Backbone Relational, que hace todo el trabajo por usted.

7

Renato estaba cerca pero "ha" y "configurado" aún no estará disponible. Creo que Reckoner señaló parte de eso. Además, deberá eliminar la propiedad de la respuesta, de lo contrario anulará el valor predeterminado.

_.extend(Backbone.Model.prototype, { 
    parse: function(resp, xhr) { 
     var attr, model, models, collection, options; 
     for (var prop in resp) { 
      if (this.defaults && this.defaults[prop]) { 
       attr = this.defaults[prop]; 
       if (attr instanceof Backbone.Model) { 
        model = attr.clone(); 
        model.set(resp[prop]); 
        resp[prop] = model; 
       } else if (attr instanceof Backbone.Collection) { 
        models = attr.map(function (model) { return model.clone(); }); 
        options = _.clone(attr.options); 
        collection = new attr.constructor(models, options); 
        collection.add(resp[prop]); 
        resp[prop] = collection; 
       } 
      } 
     } 
     return resp; 
    } 
}); 

Espero que ayude a alguien.

Cuestiones relacionadas