2011-08-16 8 views
23

Tengo un Backbone.Model llamado Company. Mi modelo Company tiene Employees Backbone.Collection que contiene Employee modelos.¿Cómo puedo pasar propiedades a un Backbone.Model que no deseo ser tratado como atributos?

Cuando instanciar mis modelos Employee para completar la colección Employees deseo que tengan una referencia al Company al que pertenecen. Pero cuando paso Company se convierte en uno de los atributos de Employee. Este es un problema cuando voy a guardar el Employee porque el método toJSON contendrá un objeto Company, cuando en la base de datos todo lo que almaceno es el entero de clave externa company_id.

Ojalá hubiera un segundo parámetro para Backbone.Model que aceptaba propiedades del modelo que no son parte de los atributos principales. ¿Cómo puedo evitar esto? Me doy cuenta de que podría instanciar mis modelos Employee y luego adjuntar el Company, pero realmente quiero hacer todas las asignaciones en un "constructor" tradicional en lugar de adjuntar propiedades desde el exterior.

ej .:

Employee = Backbone.Model.extend({}); 

Employees = Backbone.Collection.extend({ 
    model: Employee 
}); 

Company = Backbone.Model.extend({ 
    initialize: function() { 
    this.employees = new Employees({}); 
    } 
}); 

c1 = new Company({id: 1}); 
e = new Employee({name: 'Joe', company_id: 1, company: c1}); 
c1.employees.add(e); 

e.get('company'); // => c1 

e.save(); // BAD -- attempts to save the 'company' attribute, when in reality I only want to save name and company_id 


//I could do 
c2 = new Company({id: 2}); 
e2 = new Employee({name: 'Jane', company_id: 2}); 
e2.company = c2; 
c2.employees.add(e); 

e.company; // => c2 

//I don't like this second method because the company property is set externally and I'd have to know it was being set everywhere in the code since the Employee model does not have any way to guarantee it exists 

Respuesta

46

Siempre se puede leer de forma manual desde el objeto options y almacenarla como usted quiera. Las opciones se pasan como segundo argumento al método initialize:

var Employee = Backbone.Model.extend({ 
    initialize: function(attributes, options) { 
     this.company = options.company; 
    } 
}); 
var shesek = new Employee({name: 'Nadav'}, {company: Foobar}); 

Como alternativa, puede utilizar Backbone-relational que hace que sea mucho más fácil de manejar modelos que contiene referencias a otros modelos y colección.

Usted también puede estar interesado en making toJSON() recursive (un parche que presenté a su gestor de incidencias)

+0

Backbone.Model muestra que sólo acepta una única matriz de atributos aquí: http://documentcloud.github.com/backbone/#Model-constructor estoy tentado a probar Backbone-relacional pero desde Backbone en sí todavía está cambiando Tengo miedo de invertir en extensiones que pueden no seguir el ritmo del rápido desarrollo de Backbone. –

+0

Pero veo al buscar en el código que la función de inicialización de Backbone.Model toma atributos y opciones. Mi error. –

+0

Los documentos no están actualizados. Ver el [origen del constructor] (https://github.com/documentcloud/backbone/blob/master/backbone.js#L132) – shesek

1

Puede reemplazar el método ahorrar en el modelo para convertir el registro salvar a enviar solamente el nombre y la ID de empresa.

Employee = Backbone.Model.extend({ 
    save: function() { 
     var toSend = {name:this.get('name'),company_id: this.get('company').get('id')} 
     // method to send toSend to server. 
    } 
}); 
Cuestiones relacionadas