tutorial significado backbone javascript json backbone.js

javascript - significado - Backbone-Colecciones anidadas en Modelos



backbone significado (2)

¿Es posible anidar colecciones dentro de 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. Pero, ¿es posible establecer la colección como parte del modelo, de modo que el JSON que exporta tenga este aspecto?

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

De lo contrario, ¿cómo gestionas la sincronización de un modelo con colecciones relacionadas en el back-end? ¿Debes acceder a la sincronización de la red troncal y reconstruir el JSON o hay algo más integrado?

Lo siento 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.


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 toJSON() para convertir de nuevo a la estructura JSON, adecuada para guardar en el servidor.

Esto es perfectamente aceptable para subcolecciones pequeñas. 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.


Renato estuvo cerca pero "tiene" y "establecer" 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.