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 belongsTo
và hasMany
.
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:
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ó.
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
Giải thích hay – sarmahdi