首先,this 的帖子可能会解释一些事情。这不是你的确切问题,但答案的原因是相似的。
但是,要清楚地了解什么是逆,您应该熟悉directed graphs。虽然不是很明显,但有向图是 belongsTo 和 hasMany 背后想法的推动力。
但让我们回到细节。就拿他们的例子来说,只是去掉一些东西让它更真实。
App.Post = DS.Model.extend({
comments: DS.hasMany('comment', { inverse: 'post' })
});
App.Comment = DS.Model.extend({
post: DS.belongsTo('post', { inverse: 'comments' })
});
这是一个更真实的例子。每个帖子可以有任意数量的 cmets,而评论必须恰好属于一个帖子。说得通。如您所见,这些倒数相互引用。但什么是逆?反向关系仅描述了在另一侧称为两个节点之间的边的内容。比如看这张图:
您会看到两个节点之间有一条边。从Post 对象的角度来看,边缘称为comments。如果您想通过该边缘连接节点,您可以调用post.get('comments')。但从Comment 对象的角度来看,边缘称为post。如果您想使用Comment 对象通过该边连接节点,则必须调用comment.get('post')。这就是逆。它描述了不同的对象如何引用相同的关系。不同的名字,相同的优势。通过显式声明逆向,您可以告诉一个对象 other 对象调用边缘的内容。
为什么这很重要?嗯,Ember-Data 需要知道这一点,以便它可以互惠关系。例如,假设您有以下代码:
var post = store.find('post', '1');
var newComment = store.createRecord('comment', {});
...
post.get('comments').addObject(newComment);
您所做的是创建一个新评论并将其连接到现有的帖子对象。一个足够简单的用例。但是有一个问题:您只告诉帖子有关评论,反之亦然。您告诉帖子您连接了评论,但您没有告诉评论您将其连接到帖子。但作为用户,您希望这两者同时发生。嗯,他们这样做了,那是因为 Ember-Data 为您做到了。使用反向关系的名称,Ember-Data 确保当你做一个时,另一个也会发生。当你这样做时:
post.get('comments').addObject(newComment);
Ember-Data 在幕后确实做到了:
post.get('comments').addObject(newComment);
newComment.set('post', post);
这就是 Ember-Data 需要反向关系的原因:因此它可以保持完整性,而无需您担心。