2011-08-16 11 views
23

Ho un Backbone.Model denominato Company. Il mio modello Company ha un Employees Backbone.Collection contenente i modelli Employee.Come posso passare le proprietà in un Backbone.Model che non desidero essere trattato come attributi?

Quando si istanziano i miei modelli Employee per popolare la raccolta Employees, desidero che abbiano un riferimento allo Company a cui appartengono. Ma quando passo Company in esso diventa uno degli attributi di Employee. Questo è un problema quando vado a salvare il Employee perché il metodo toJSON conterrà un oggetto Company, quando nel database tutto ciò che memorizzo è il numero intero estero company_id.

Mi piacerebbe che esistesse un secondo parametro per Backbone.Model che accettava le proprietà del modello che non fanno parte degli attributi principali. Come posso aggirare questo? Mi rendo conto che potrei istanziare i miei modelli Employee e successivamente collegare lo Company, ma voglio davvero eseguire tutti i compiti in un "costruttore" tradizionale piuttosto che collegare le proprietà dall'esterno.

es .:

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 

risposta

46

Si può sempre leggere manualmente dall'oggetto options e conservarlo come più vi piace. Le opzioni sono passato come secondo argomento al metodo di inizializzazione:

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

In alternativa, è possibile utilizzare Backbone-relational che rende molto più facile da gestire modelli che contiene riferimenti ad altri modelli e la raccolta.

Potreste anche essere interessati a making toJSON() recursive (una patch ho presentato alla loro issue tracker)

+0

Backbone.Model mostra accetta solo un singolo array attributi qui: http://documentcloud.github.com/backbone/#Model-constructor sono tentato di provare Backbone-relazionale, ma dal momento che Backbone stessa è ancora cambiando Ho paura di investire in estensioni che potrebbero non tenere il passo con il rapido sviluppo di Backbone. –

+0

Ma vedo quando osservo nel codice che la funzione di inizializzazione di Backbone.Model accetta sia gli attributi che le opzioni. Colpa mia. –

+0

I documenti non sono aggiornati. Vedi la [fonte del costruttore] (https://github.com/documentcloud/backbone/blob/master/backbone.js#L132) – shesek

1

È possibile ignorare il metodo Save sul modello di convertire il record salvare inviare solo nome e la società id.

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. 
    } 
}); 
Problemi correlati