Tengo el siguiente JSON proporcionado desde un servidor. Con esto, quiero crear un modelo con un modelo anidado. No estoy seguro de cuál es la forma de lograrlo.
//json
[{
name : "example",
layout : {
x : 100,
y : 100,
}
}]
Quiero que estos se conviertan en dos modelos de backbone anidados con la siguiente estructura:
// structure
Image
Layout
...
Así que defino el modelo Layout así:
var Layout = Backbone.Model.extend({});
Pero, ¿cuál de las dos técnicas (si las hay) a continuación debo utilizar para definir el modelo de imagen? ¿A o B a continuación?
UNA
var Image = Backbone.Model.extend({
initialize: function() {
this.set({ 'layout' : new Layout(this.get('layout')) })
}
});
o, B
var Image = Backbone.Model.extend({
initialize: function() {
this.layout = new Layout( this.get('layout') );
}
});
define(['modelFile'], function(MyModel){... do something with MyModel})
Pero tienes razón. Tengo el hábito de hacer referencia al modelo por la convención que sugirió.Backbone.Model.prototype.parse
función. Entonces, todo lo que tienen que hacer sus modelos es definir los tipos de objeto del submodelo (en su atributo "modelo").Estoy publicando este código como un ejemplo de la sugerencia de Peter Lyon para redefinir el análisis. Tenía la misma pregunta y esto funcionó para mí (con un backend de Rails). Este código está escrito en Coffeescript. Hice algunas cosas explícitas para personas que no están familiarizadas con él.
o, en JS
fuente
Uso
Backbone.AssociatedModel
de asociaciones troncales :fuente
No estoy seguro de que Backbone tenga una forma recomendada de hacer esto. ¿El objeto Layout tiene su propio ID y registro en la base de datos back-end? Si es así, puede convertirlo en su propio modelo como lo ha hecho. De lo contrario, puede dejarlo como un documento anidado, solo asegúrese de convertirlo hacia y desde JSON correctamente en los métodos
save
yparse
. Si terminas adoptando un enfoque como este, creo que tu ejemplo A es más coherente con el backbone, yaset
que se actualizará correctamenteattributes
, pero de nuevo no estoy seguro de qué hace Backbone con los modelos anidados de forma predeterminada. Es probable que necesite algún código personalizado para manejar esto.fuente
new
operador. Lo he editado para corregir este error.Yo optaría por la Opción B si quieres mantener las cosas simples.
Otra buena opción sería utilizar Backbone-Relational . Simplemente definirías algo como:
fuente
Utilizo el complemento Backbone DeepModel para modelos y atributos anidados.
https://github.com/powmedia/backbone-deep-model
Puede enlazar para cambiar eventos en niveles de profundidad. por ejemplo:
model.on('change:example.nestedmodel.attribute', this.myFunction);
fuente
Versión CoffeeScript de la hermosa respuesta de rycfung :
¿No es tan dulce? ;)
fuente
Tuve el mismo problema y he estado experimentando con el código en la respuesta de rycfung , lo cual es una gran sugerencia.
Sin embargo, si usted no quiere a
set
los modelos anidados directamente, o no quieren pasar constantemente{parse: true}
en eloptions
, otro enfoque sería redefinirset
sí.En Backbone 1.0.0 ,
set
que se llama enconstructor
,unset
,clear
,fetch
ysave
.Considere el siguiente supermodelo , para todos los modelos que necesitan anidar modelos y / o colecciones.
Tenga en cuenta que
model
,_setModel
y_unsetModel
se dejan en blanco a propósito. En este nivel de abstracción, probablemente no pueda definir acciones razonables para las devoluciones de llamada. Sin embargo, es posible que desee anularlos en los submodelos que se extiendenCompoundModel
.Esas devoluciones de llamada son útiles, por ejemplo, para vincular oyentes y propagar
change
eventos.Ejemplo:
Con esto, tiene la creación automática de modelos anidados y la propagación de eventos. También se proporciona y prueba el uso de muestra:
Salida:
fuente
Me doy cuenta de que llego tarde a esta fiesta, pero recientemente lanzamos un complemento para tratar exactamente este escenario. Se llama backbone-nestify .
Entonces su modelo anidado permanece sin cambios:
var Layout = Backbone.Model.extend({...});
Luego use el complemento cuando defina el modelo contenedor (usando Underscore.extend ):
Después de eso, asumiendo que tiene un modelo
m
que es una instancia deImage
, y ha configurado el JSON a partir de la preguntam
, puede hacer:fuente
Utilice formas de columna vertebral
Admite formularios anidados, modelos y toJSON. TODOS ANIDADOS
fuente
Si no desea agregar otro marco, es posible considerar la creación de una clase base con anulado
set
ytoJSON
y utilizar de esta manera:Necesitará
BaseModel
esta respuesta (disponible, si lo desea, como esencia ).fuente
También tenemos este problema y un trabajador del equipo ha implementado un complemento llamado backbone-nested-attribute.
El uso es muy sencillo. Ejemplo:
Con esto, el modelo Tree puede acceder a las frutas:
Puedes ver más información aquí:
https://github.com/dtmtec/backbone-nested-attributes
fuente