2011-08-16 4 views
23

Company이라는 Backbone.Model이 있습니다. 내 Company 모델은 모델을 포함하는 Employees 백본. 콜렉션이 있습니다.속성으로 취급하고 싶지 않은 Backbone.Model에 속성을 어떻게 전달할 수 있습니까?

Employee 모델을 인스턴스화하여 Employees 컬렉션을 채울 때 해당 모델이 속하는 Company에 대한 참조를 갖고 싶습니다. 하지만 Company을 전달하면 Employee의 속성 중 하나가됩니다. 이 문제는 Employee을 저장하려고 할 때 toJSON 메서드에 Company 메서드가 포함되어 데이터베이스를 저장할 때 외래 키 정수 인 company_id이 포함되어 있기 때문에 문제가됩니다.

핵심 속성의 일부가 아닌 모델 속성을 수락 한 Backbone.Model에 대한 두 번째 매개 변수가 있었으면 좋겠습니다. 이 문제를 어떻게 해결할 수 있습니까? 내 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 

답변

46

당신은 항상 options 개체에서 수동으로 읽고 그러나 당신이 좋아 저장할 수 있습니다. 옵션은 초기화 방법에 대한 두 번째 인수로 전달됩니다

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

또는, 당신은 훨씬 더 쉽게 다른 모델과 컬렉션에 대한 참조를 포함 모델을 처리 할 수 ​​Backbone-relational을 사용할 수 있습니다.

당신은 또한 당신은 단지 이름과 회사 ID를 보낼에 저장 기록을 변환하는 모델에 방법을 저장 재정의 할 수 있습니다 making toJSON() recursive (내가 그들의 이슈 트래커에 제출 패치)

+0

Backbone.Model는 단지 여기에 하나의 속성 배열을 받아 보여줍니다 나는 백본 관계형 시도하지만, 백본부터 자체는 여전히 변화하고 유혹하고 http://documentcloud.github.com/backbone/#Model-constructor 백본의 신속한 개발을 따라갈 수없는 확장 프로그램에 투자하는 것이 두렵습니다. –

+0

하지만 코드에서 Backbone.Model의 초기화 함수가 속성과 옵션을 모두 사용한다고 생각할 때가 있습니다. 내 잘못이야. –

+0

문서가 업데이트되지 않았습니다. [생성자 소스] (https://github.com/documentcloud/backbone/blob/master/backbone.js#L132)를 참조하십시오. – shesek

1

에 관심이있을 수 있습니다.

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. 
    } 
}); 
관련 문제