2012-02-29 13 views
5

Tôi có mô hình xương sống được gọi là Member - chứa dữ liệu thành viên như tên, họ, email, điện thoại, v.v. Nó cũng bao gồm các trường đa giá trị mà tôi cần giữ làm bộ sưu tập - đây là DegreesAffiliations.Làm cách nào để tôi có thể triển khai phân tích cú pháp chính xác trong mô hình Backbone để bao gồm các bộ sưu tập?

Vấn đề tôi đang gặp phải khi gọi phương thức fetch() trong mô hình của tôi là có sự không phù hợp trở kháng giữa các mảng cơ bản và đối tượng thu thập trong mô hình của tôi. Kể từ khi parse theo định nghĩa là nghĩa vụ phải trả lại một băm được sử dụng trong set hơn là thực sự thiết lập các giá trị, nó là không thể cho tôi để thiết lập các bộ sưu tập của tôi theo cách này. Ví dụ - nếu tôi trả về một đối tượng JavaScript cho Degrees trông giống như sau: {degrees: [{id: 1, title: "PhD"}]}, thì điều này sẽ chuyển đổi bộ sưu tập degree của tôi thành một mảng phẳng. Đây là mã của tôi:

window.Models.Member = Backbone.Model.extend({ 

    url: '/api/member', 

    initialize: function() { 

     _.bindAll(this); 

     this.set('degrees', new window.Collections.DegreesList()); 

     this.fetch(); 

    }, 

    parse: function(response) { 

     var setHash = {}; 

     setHash.first_name = response.first_name; 
     setHash.last_name = response.last_name; 
     setHash.office_phone = response.office_phone; 

     // When this is run, this.get('degrees') will now return a flat array rather than a DegreesList collection 
     setHash.degrees = _(response.degrees).each(function(item) { 
       return {id: item.id, title: item.title} 
     }); 

     return setHash; 

    } 

}); 

tôi có thể tự thiết lập các bộ sưu tập trong chức năng phân tích của tôi, nhưng điều đó dường như lật đổ của nó cách Backbone, và hacky.

EDIT: Tôi đã tạm thời giải quyết vấn đề bằng cách làm như sau:

parse: function(response) { 

    var setHash = {}; 

    setHash.first_name = response.first_name; 
    setHash.last_name = response.last_name; 
    setHash.office_phone = response.office_phone; 

    this.get('degrees').reset(response.degrees); 

    return setHash;  
} 

tôi nghi ngờ đây là giải pháp tối ưu, nhưng nó chắc chắn làm việc cho bây giờ. Tôi đang mở để gợi ý tốt hơn.

+4

Hãy thử điều này: mương 'phân tích cú pháp: 'function (nó doesn dường như không cần thiết), và thay vào đó bên trong 'initialize:' tự biến đổi thuộc tính 'degrees' từ một mảng thành một bộ sưu tập Backbone ... –

+0

' parse' được gọi tự động khi phương thức 'fetch' trả về. Tôi có thể tự thiết lập lại thuộc tính 'độ' trở lại một bộ sưu tập sau khi' fetch' được gọi, nhưng sau đó tôi sẽ không có bất kỳ dữ liệu nào trong bộ sưu tập mà tôi muốn ... và dữ liệu đến. – rybosome

+0

làm nhiều việc với 'độ' nếu bạn thêm chúng theo cách thủ công trong' phân tích'. Đi với gợi ý @ ŠimeVidas 'và sử dụng bộ sưu tập Backbone cho họ. Nó cho phép bạn đối phó với mỗi 'mức độ 'cách Backbone. – sntran

Trả lời

2

Tôi sử dụng chính xác cùng một cách giải quyết mà bạn đang đề xuất trừ một vài thay đổi.

  1. Để tránh hiểu lầm tôi gọi là bộ sưu tập trong JSON: degreesData
  2. Trong initialize tôi tạo ra các bộ sưu tập như thế này: this.degrees = new Degrees().reset(this.get("degreesData"));
+0

Xin lỗi vì đã tìm hiểu các câu hỏi cũ, nhưng làm thế nào bạn có thể lấy độData từ bên trong khởi tạo? Khởi tạo chạy khi bạn khởi tạo mô hình .. degressData sẽ không được điền cho đến sau khi bạn tìm nạp, mà bạn làm INSIDE khởi tạo. – raynjamin

+0

@raynjamin những gì tôi cư trú trong khởi tạo là bộ sưu tập 'độ' không có thuộc tính' degreesData'. Thuộc tính 'degreesData' xuất hiện như một phần của JSON ban đầu được sử dụng để khởi tạo Mô hình, vì vậy thông tin này có sẵn trong' initialize() '. _ (Nếu tôi nhớ chính xác) _ – fguillen

+0

Đào lên điều này một lần nữa, điều gì sẽ xảy ra nếu bạn cần khởi tạo một mô hình trống? Bạn sẽ phải bắt đầu viết mã theo mặc định và công cụ. Có thể phân tích cú pháp là một lựa chọn tốt hơn, ít nhất bạn (gần như) được đảm bảo có dữ liệu tại thời điểm đó. – backdesk

Các vấn đề liên quan