在阅读了Ember页面上的入门指南之后,我仍然有点混淆了什么是反向关系,以及何时定义它们.我知道你可能需要在定义相同类型的多个关系时使用它们,但我发现这个例子非常不清楚.这是来自文档的示例:
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'
})
});
Run Code Online (Sandbox Code Playgroud)
在这个例子中,为什么redPost单挑作为逆而不是其他类型的帖子?定义redPost为反差如何区别于其他?我也不太明白为什么一个评论真的有多个帖子,只是增加了我的困惑.
GJK*_*GJK 71
首先,这篇文章可能会解释一些事情.这不是你的确切问题,但答案的原因是相似的.
但是,为了清楚地了解反转是什么,你应该熟悉有向图.虽然不会立即显现,有向图是什么助长背后的想法belongsTo和hasMany.
但让我们回到具体细节.让我们以他们为榜样,只消除一些东西,使其更加真实.
App.Post = DS.Model.extend({
comments: DS.hasMany('comment', { inverse: 'post' })
});
App.Comment = DS.Model.extend({
post: DS.belongsTo('post', { inverse: 'comments' })
});
Run Code Online (Sandbox Code Playgroud)
这是一个更真实的例子.每个帖子可以有任意数量的评论,而评论必须属于一个帖子.说得通.如您所见,这些反转是相互引用的.但是反过来又是什么呢?反向关系仅描述了在另一侧调用两个节点之间的边缘.例如,看看这张图:

您将看到两个节点之间有一条边.从Post对象的角度来看,边缘被调用comments.如果您希望通过该边缘连接节点,则可以调用post.get('comments').但是从Comment对象的角度来看,边缘被称为post.如果您想使用该Comment对象通过该边缘连接节点,则必须调用comment.get('post').这是反过来的.它描述了不同对象如何引用相同的关系.不同的名字,相同的边缘.通过显式声明反向,您可以告诉一个对象另一个对象称之为边.
为什么这很重要?好吧,Ember-Data需要知道这样才能回报关系.例如,假设您有以下代码:
var post = store.find('post', '1');
var newComment = store.createRecord('comment', {});
...
post.get('comments').addObject(newComment);
Run Code Online (Sandbox Code Playgroud)
您所做的是创建一个新注释并将其连接到现有的post对象.一个简单的用例.但是有一个问题:你只是告诉帖子有关评论,反之亦然.你告诉帖子你已连接评论,但你没有告诉评论你把它连接到帖子.但作为用户,您希望这两者同时发生.嗯,他们这样做,那是因为Ember-Data为你做到了.使用反向关系的名称,Ember-Data确保当您执行一个时,另一个也会发生.当你这样做:
post.get('comments').addObject(newComment);
Run Code Online (Sandbox Code Playgroud)
Ember-Data,在幕后,真的这样做:
post.get('comments').addObject(newComment);
newComment.set('post', post);
Run Code Online (Sandbox Code Playgroud)
这就是为什么Ember-Data需要反向关系的原因:所以它可以保持完整性,而不必担心它.
| 归档时间: |
|
| 查看次数: |
5390 次 |
| 最近记录: |