2011-08-16 28 views
23

Tôi có Backbone.Model có tên Company. Mô hình Company của tôi có Employees Backbone.Collection có chứa các mô hình Employee.Làm cách nào để chuyển các thuộc tính vào Backbone.Model mà tôi không muốn được coi là thuộc tính?

Khi tôi nhanh chóng mô hình Employee để điền vào bộ sưu tập Employees Tôi muốn chúng có tham chiếu đến số Company chúng thuộc về. Nhưng khi tôi vượt qua Company, nó trở thành một trong các thuộc tính của Employee. Đây là vấn đề khi tôi đi để lưu Employee vì phương pháp toJSON sẽ chứa đối tượng Company, khi trong cơ sở dữ liệu tôi lưu trữ là số nguyên khóa ngoài company_id.

Tôi muốn có tham số thứ hai cho Backbone.Model chấp nhận các thuộc tính mô hình không phải là một phần của thuộc tính cốt lõi. Làm sao để tôi có được xung quanh này? Tôi nhận ra rằng tôi có thể tạo ra các mô hình Employee của mình và sau đó đính kèm Company, nhưng tôi thực sự muốn thực hiện tất cả các nhiệm vụ trong một "hàm tạo" truyền thống hơn là gắn các thuộc tính từ bên ngoài.

ví dụ .:

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 

Trả lời

46

Bạn luôn có thể đọc nó bằng tay từ các đối tượng options và lưu nó tuy nhiên bạn muốn. Các tùy chọn được thông qua như là đối số thứ hai cho phương thức khởi tạo:

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

Ngoài ra, bạn có thể sử dụng Backbone-relational mà làm cho nó dễ dàng hơn để xử lý các mô hình có chứa tham chiếu đến các mô hình khác và bộ sưu tập.

Bạn cũng có thể quan tâm making toJSON() recursive (một bản vá Tôi trình theo dõi vấn đề của họ)

+0

Backbone.Model cho thấy nó chỉ chấp nhận một mảng thuộc tính duy nhất ở đây: http://documentcloud.github.com/backbone/#Model-constructor Tôi bị cám dỗ để thử Backbone quan hệ nhưng vì Backbone bản thân vẫn đang thay đổi Tôi e ngại đầu tư vào các phần mở rộng có thể không theo kịp sự phát triển nhanh chóng của Backbone. –

+0

Nhưng tôi thấy khi tìm kiếm mã mà hàm khởi tạo Backbone.Model thực hiện cả thuộc tính và tùy chọn. Lỗi của tôi. –

+0

Tài liệu không được cập nhật. Xem [constructor source] (https://github.com/documentcloud/backbone/blob/master/backbone.js#L132) – shesek

1

Bạn có thể ghi đè lên các phương pháp tiết kiệm trên mô hình để chuyển đổi các bản ghi lưu vào chỉ gửi tên và công ty 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. 
    } 
}); 
Các vấn đề liên quan