【问题标题】:Ember - Understanding Inverse RelationshipsEmber - 了解反向关系
【发布时间】:2014-10-30 20:35:50
【问题描述】:

在阅读了 Ember 页面上的 Getting Started 指南后,我仍然有点困惑到底什么是反向关系,以及何时定义它们。我知道在定义多个相同类型的关系时可能需要使用它们,但我发现这个示例非常不清楚。这是文档中的示例:

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 定义为逆如何将其与其余部分区分开来?我也不太明白为什么一条评论实际上有多个帖子,这只会增加我的困惑。

【问题讨论】:

    标签: ember.js


    【解决方案1】:

    首先,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' })
    });
    

    这是一个更真实的例子。每个帖子可以有任意数量的 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 需要反向关系的原因:因此它可以保持完整性,而无需您担心。

    【讨论】:

    • 现在完全明白了——非常感谢。我认为 Ember 文档可以使用更好的示例。
    • 很好的解释
    猜你喜欢
    • 1970-01-01
    • 2013-10-12
    • 2018-07-05
    • 2014-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-06
    • 2012-07-09
    相关资源
    最近更新 更多