2012-03-28 13 views
10

tengo dos modelos de columna vertebral, cargados desde el servidor:backbone.js modelo complejo se ha podido recuperar

var Model = Backbone.Model.extend({}); 
var SubModel = Backbone.Model.extend({}); 

var SubCollection = Backbone.Collection.extend({ 
    model: SubModel 
}); 

var m = new Model(); 
m.fetch({success: function(model) 
{ 
    model.submodels = new SubCollection(); 
    model.submodels.url = "/sub/" + model.get("id"); 
    model.submodels.fetch(); 
}}); 

Por lo tanto, el servidor tiene que enviar dos respuestas separadas. Por ejemplo:

{ name: "Model1", id: 1 } // For Model fetch 

y

[{ name: "Submodel1", id: 1 }, { name: "Submodel2", id: 2 }] // For Submodel collection fetch 

¿Hay una manera de buscar una instancia de modelo con la colección submodelo a la vez, como:

{ 
    name: "Model1", 
    id: 1, 
    submodels: [{ name: "Submodel1", id: 2 }, { name: "Submodel1", id: 2 }] 
} 

Respuesta

11

Para poder hacer eso depende a su back-end - realmente no tiene nada que ver con Backbone.

¿Puede configurar su tecnología de fondo para devolver los modelos relacionados como recursos anidados?

Si su back-end es Carriles, por ejemplo, y sus modelos están relacionados en ActiveRecord, una forma de hacer esto es algo así como

respond_to do |format| 
    format.json { render :json => @model.to_json(:include => [:submodels])} 
end 

¿Qué tecnología de back-end está utilizando?

Editar:

Lo sentimos, mal entendido la esencia de su pregunta, una vez que tenga su back-end de devolver el JSON en el formato adecuado, sí, hay cosas que hay que hacer en la columna vertebral de ser capaz de manejarlo.

Backbone-relacional

Una forma de tratar con él es utilizar Backbone-Relational, un plugin para el manejo de los modelos relacionados.

te definen modelos relacionados a través de una propiedad 'relaciones':

SubModel = Backbone.RelationalModel.extend({}); 

SubCollection = Backbone.Collection.extend({ 
    model: SubModel 
}); 

Model = Backbone.RelationalModel.extend({ 
    relations: [ 
    { 
     type: 'HasMany', 
     key: 'submodels', 
     relatedModel: 'SubModel', 
     collectionType: 'SubCollection' 
    } 
    ] 
}); 

Cuando va a buscar su modelo del JSON, se creará automáticamente una subcolección bajo la propiedad de los 'submodelos' y rellenarla con submodelos - una para cada Objeto JSON en la matriz.

jsFiddle para la columna vertebral-relacional: http://jsfiddle.net/4Zx5X/12/

A Mano

Usted puede hacer esto a mano si lo desea así. En implica anulando la función parse para su clase de modelo (perdóname si mi JS no es 100% correcto - estado haciendo CoffeeScript tanto últimamente su cableado en el cerebro)

var Model = Backbone.Model.extend({ 
    parse: function(response) { 
    this.submodels = new SubCollection(); 
    // Populate your submodels with the data from the response. 
    // Could also use .add() if you wanted events for each one. 
    this.submodels.reset(response.submodels); 
    // now that we've handled that data, delete it 
    delete response.submodels; 
    // return the rest of the data to be handled by Backbone normally. 
    return response; 
    } 
}); 

parse() se ejecuta antes de inicializar() y antes de configurar los atributos hash, por lo que no puede acceder a model.attributes, y model.set() falla, por lo que tenemos que establecer la colección como una propiedad directa del modelo, y no como una "propiedad" que usted accedería con get/set.

Dependiendo de lo que desee que ocurra en "guardar()", es posible que deba sobrescribir `a JSON 'para que su versión serializada del modelo se parezca a lo que espera su API.

jsFiddle:

http://jsfiddle.net/QEdmB/44/

+0

así ... back-end es CPP (y no hay manera de cambiarlo a Rails o Django) :) pero, en lo que a hechos a mano entendido, su solución formateará la respuesta como una JSON dada en mi pregunta ... por lo tanto, la red troncal no interpretará los objetos en la matriz "submodelos" como Submodelos ... ¿estoy en lo cierto? –

+0

La variante con backbone-relational no parece funcionar correctamente, porque la matriz "submodelos" se convierte en una matriz de objetos, no en SubModels He probado un poco tu violín, mira http://jsfiddle.net/4Zx5X/3/ –

+0

Ok, lo probaré en una verdadera solicitud de ajax. De todos modos, gracias por tu respuesta detallada! –

Cuestiones relacionadas