2011-08-16 8 views
23

Company adında bir Backbone.Model sahibiyim. Benim Company modelimde Employee modellerini içeren Employees Backbone.Collection vardır.Özellikleri bir öznitelik olarak ele almak istemediğim bir Backbone.Model'e nasıl geçirebilirim?

Employee modellerini, Employees koleksiyonunu doldurmaya başladığımda, bunlara ait oldukları Company referansına sahip olmak isterim. Ancak Company'u geçtiğimde, Employee'un özelliklerinden biri olur. Bu, Employee kaydetmek için gittiğimde bir sorun, yönteminin Company nesnesini içerdiğinden, tüm veritabanında sakladığım yabancı anahtar tamsayı company_id.

Keşke, çekirdek özniteliklerinin bir parçası olmayan model özelliklerini kabul eden ikinci bir parametre olan Backbone.Model olmasını isterdim. Bunu nasıl aşabilirim? Employee modelimi gerçekleştirebileceğimi ve daha sonra Company'u ekleyebileceğimin farkındayım, ancak tüm ödevleri dışarıdaki özellikleri eklemek yerine geleneksel bir "yapıcıda" gerçekten yapmak istiyorum.

ör .:

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 

cevap

46

Hep options nesneden elle okuyun ve nasıl istersen depolayabilir. seçenekleri initialize yöntemine ikinci argüman olarak geçirilen:

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

Alternatif olarak, çok daha kolay diğer modeller ve koleksiyon referanslar içeriyor modellerini ele sağlar Backbone-relational kullanabilirsiniz.

Ayrıca yalnızca isim ve şirket kimliği göndermek için kaydetmek kayıt dönüştürmek için model üzerinde yöntemini tasarruf geçersiz kılabilir making toJSON() recursive (ben onların sorunu izci sunulan bir yama)

+0

Backbone.Model sadece burada tek nitelikler dizisi kabul gösteriler: Ben Backbone-ilişkisel denemek için ama Omurga beri kendisi halen değişiyor cazip http://documentcloud.github.com/backbone/#Model-constructor Omurganın hızlı gelişimine ayak uyduramayan uzantılara yatırım yapmaktan korkuyorum. –

+0

Fakat baktığımda, Backbone.Model'in ilklendirme işlevinin hem özellikleri hem de seçenekleri aldığını görüyorum. Benim hatam. –

+0

Dokümanlar güncellenmedi. [Yapıcı kaynak] bölümüne bakın (https://github.com/documentcloud/backbone/blob/master/backbone.js#L132) – shesek

1

ilginizi çekebilir.

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. 
    } 
}); 
İlgili konular