web-dev-qa-db-ja.com

属性として扱われたくないプロパティをBackbone.Modelに渡すにはどうすればよいですか?

Companyという名前のBackbone.Modelがあります。私のCompanyモデルにはEmployeesモデルを含むEmployeeBackbone.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
23
aw crud

いつでも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()を再帰的にする (私が彼らの課題追跡システムに提出したパッチ)にも興味があるかもしれません

48
shesek

モデルの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.
   }
});
1
Justin Thomas