gpt4 book ai didi

ember.js - Ember - 理解逆关系

转载 作者:行者123 更新时间:2023-12-02 14:24:27 42 4
gpt4 key购买 nike

读完 Getting Started 后在 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'
})
});

在此示例中,为什么将 redPost 单独选为逆帖子而不是其他类型的帖子之一?将 redPost 定义为逆函数如何将其与其他的区分开来?我也不太明白为什么一条评论有多个帖子,这只会让我更加困惑。

最佳答案

首先,this帖子可能会解释一些事情。这不是你的确切问题,但答案的原因是相似的。

但是,为了清楚地了解逆是什么,您应该熟悉 directed graphs 。虽然不是很明显,但有向图是 belongsTohasMany 背后的想法的动力。

但是让我们回到具体细节。让我们以他们为例,只删除一些东西以使其更现实。

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

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

这是一个更真实的例子。每个帖子可以有任意数量的评论,而评论必须恰好属于一个帖子。说得通。正如您所看到的,这些倒数是相互引用的。但什么是逆呢?逆关系只是描述了两个节点之间的边在另一边的名称。例如,看这张图片:

enter image description here

您将看到两个节点之间有一条边。从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);

您所做的是创建一个新评论并将其连接到现有的帖子对象。一个足够简单的用例。但有一个问题:您只告诉了该帖子有关该评论的信息,反之亦然。您告诉帖子您将评论关联起来,但您没有告诉评论您将其与帖子关联起来。但作为用户,您希望这两者同时发生。嗯,他们确实做到了,那是因为 Ember-Data 为您做到了。使用逆关系的名称,Ember-Data 确保当您执行其中一个操作时,另一个操作也会发生。当你这样做时:

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

Ember-Data 在幕后确实做到了这一点:

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

这就是为什么 Ember-Data 需要反向关系:这样它就可以保持完整性,而无需您担心。

关于ember.js - Ember - 理解逆关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25693518/

42 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com