Company
という名前のBackbone.Modelがあります。私のCompany
モデルにはEmployees
モデルを含むEmployee
Backbone.Collectionがあります。
Employee
モデルをインスタンス化してEmployees
コレクションにデータを入力するとき、それらが属するCompany
への参照を持たせたいと思います。しかし、Company
を渡すと、Employee
の属性の1つになります。これは、Employee
メソッドにtoJSON
オブジェクトが含まれるため、Company
を保存するときに問題になります。データベースに格納するのは、外部キー整数company_id
。
コア属性の一部ではないモデルプロパティを受け入れるBackbone.Modelの2番目のパラメーターがあればいいのにと思います。どうすればこれを回避できますか? Employee
モデルをインスタンス化し、後でCompany
をアタッチできることに気付きましたが、外部からプロパティをアタッチするのではなく、従来の「コンストラクター」ですべての割り当てを実行したいと考えています。
例えば。:
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
いつでもoptions
オブジェクトから手動で読み取り、好きなように保存できます。オプションは、initializeメソッドの2番目の引数として渡されます。
var Employee = Backbone.Model.extend({
initialize: function(attributes, options) {
this.company = options.company;
}
});
var shesek = new Employee({name: 'Nadav'}, {company: Foobar});
または、 Backbone-relational を使用すると、他のモデルやコレクションへの参照を含むモデルの処理がはるかに簡単になります。
toJSON()を再帰的にする (私が彼らの課題追跡システムに提出したパッチ)にも興味があるかもしれません
モデルのsaveメソッドをオーバーライドして、名前と会社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.
}
});