2014-09-05 16 views
25

Sau khi đọc qua hướng dẫn Getting Started trên trang của Ember, tôi vẫn còn hơi bối rối chính xác mối quan hệ nghịch đảo là gì và khi nào để xác định chúng. Tôi hiểu rằng bạn có thể sẽ cần phải sử dụng chúng khi xác định nhiều mối quan hệ cùng loại, nhưng tôi đã tìm thấy ví dụ rất không rõ ràng. Đây là mẫu từ các tài liệu:Ember - Hiểu mối quan hệ nghịch đảo

var belongsTo = DS.belongsTo, 
    hasMany = DS.hasMany; 

App.Comment = DS.Model.extend({ 
    onePost: belongsTo('post'), 
    twoPost: belongsTo('post'), 
    redPost: belongsTo('post'), 
    bluePost: belongsTo('post') 
}); 


App.Post = DS.Model.extend({ 
    comments: hasMany('comment', { 
    inverse: 'redPost' 
    }) 
}); 

Trong ví dụ này, tại sao là redPost chỉ ra như là nghịch đảo thay vì một trong những loại khác của bài viết? Làm thế nào để xác định redPost như là nghịch đảo phân biệt nó với phần còn lại? Tôi cũng không thực sự hiểu tại sao một bình luận có nhiều bài viết thực sự, chỉ cần thêm vào sự nhầm lẫn của tôi.

Trả lời

51

Trước hết, this bài đăng có thể giải thích mọi thứ một chút. Nó không phải là câu hỏi chính xác của bạn, nhưng những lý do cho câu trả lời là tương tự.

Tuy nhiên, để hiểu rõ hơn về những nghịch đảo là gì, bạn nên làm quen với directed graphs. Mặc dù không rõ ràng ngay lập tức, nhưng đồ thị được chỉ đạo là những gì thúc đẩy ý tưởng đằng sau belongsTohasMany.

Nhưng hãy quay lại các chi tiết cụ thể. Hãy lấy ví dụ của họ, chỉ loại bỏ một số thứ để làm cho nó thực tế hơn.

App.Post = DS.Model.extend({ 
    comments: DS.hasMany('comment', { inverse: 'post' }) 
}); 

App.Comment = DS.Model.extend({ 
    post: DS.belongsTo('post', { inverse: 'comments' }) 
}); 

Đây là ví dụ thực tế hơn. Mỗi bài đăng có thể có bất kỳ số lượng nhận xét nào, trong khi nhận xét phải thuộc về chính xác một bài đăng. Có ý nghĩa. Như bạn có thể thấy, những nghịch đảo đó đề cập đến nhau. Nhưng một nghịch đảo là gì? Một mối quan hệ nghịch đảo chỉ mô tả những gì các cạnh giữa hai nút được gọi là ở phía bên kia. Ví dụ, nhìn vào bức tranh này:

enter image description here

Bạn sẽ thấy hai nút với một cạnh duy nhất giữa chúng. Từ góc nhìn của đối tượng Post, cạnh được gọi là comments. Nếu bạn muốn có nút được kết nối bằng cạnh đó, bạn có thể gọi post.get('comments'). Nhưng từ quan điểm của đối tượng Comment, cạnh được gọi là post. Nếu bạn muốn nhận được nút được kết nối bằng cạnh đó bằng cách sử dụng đối tượng Comment, bạn phải gọi comment.get('post'). Đó là điều ngược lại. Nó mô tả cách các đối tượng khác nhau đề cập đến cùng một mối quan hệ. Tên khác nhau, cùng một cạnh. Bằng cách khai báo một cách rõ ràng nghịch đảo, bạn cho một đối tượng biết đối tượng đối tượng khác gọi là cạnh.

Tại sao điều đó quan trọng? Vâng, Ember-Data cần phải biết rằng nó có thể đáp lại các mối quan hệ. Ví dụ, giả sử bạn có đoạn mã sau:

var post = store.find('post', '1'); 
var newComment = store.createRecord('comment', {}); 

... 

post.get('comments').addObject(newComment); 

Những gì bạn đã làm là tạo ra một bình luận mới và kết nối nó với một bài đối tượng hiện có. Một trường hợp sử dụng đủ đơn giản. Nhưng có một vấn đề: bạn chỉ nói với bài viết về bình luận, chứ không phải ngược lại. Bạn đã nói với bài đăng rằng bạn đã kết nối nhận xét, nhưng bạn không nói nhận xét rằng bạn đã kết nối nhận xét đó với bài đăng. Nhưng với tư cách là người dùng, bạn mong đợi cả hai điều đó xảy ra cùng một lúc. Vâng, họ làm, và đó là bởi vì Ember-Data làm điều đó cho bạn. Sử dụng tên của mối quan hệ nghịch đảo, Ember-Data đảm bảo rằng khi bạn làm một, cái kia cũng xảy ra.Khi bạn làm điều này:

post.get('comments').addObject(newComment); 

Ember-Data, đằng sau hậu trường, thực sự thực hiện điều này:

post.get('comments').addObject(newComment); 
newComment.set('post', post); 

Đó là lý do tại sao Ember-Data cần mối quan hệ nghịch đảo: để nó có thể duy trì tính toàn vẹn mà không bạn phải lo lắng về nó.

+9

Hoàn toàn hiểu ngay bây giờ - cảm ơn bạn rất nhiều. Tôi nghĩ rằng các tài liệu Ember có thể đã sử dụng một ví dụ tốt hơn nhiều. – ncksllvn

+0

Giải thích hay – sarmahdi

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