javascript - 如何处理 backbone.js 中的关系

标签 javascript rest backbone.js backbone-relational

<分区>

我对如何设计与我的模型关系有关的 backbone.js 应用程序感到困惑。

如果我有一个事件模型,它有几个关系,比如说一个用户模型可以有很多事件,而事件模型又可以有很多评论和参与。一个用户可以有很多评论,参与可以有一个用户和一个事件。哇,真是一团糟!

Event has many Comments
Event has many Participations
Event has one User

User has many Events
User has many Participations
User has many Comments

Comment has one Event
Comment has one User

Participation has one User
Participation has one Event

好的,所以我的想法是在用户加载页面时加载事件列表,并在用户单击事件时加载有关该事件的其余信息(评论、参与和用户)。

所以问题是,我是否应该使用某种全局变量来保存所有事件、用户等,以及当我从服务器获取信息时将其放在那里(并在我从服务器获取某些内容之前检查那里),也许在某种本地存储中(我如何使用主干关系来做到这一点?)。

我的另一个想法是让每个事件都有自己独立的数据,这样做的问题是我每次点击一个事件时可能会发送冗余数据。

你推荐什么方式?

谢谢!

最佳答案

就像@mu_is_too_short 评论的那样,Backbone-relational 可能是您感兴趣的内容。用Backbone-relational您的模型和子模型集合是自动创建的,并且可以跨父子关系管理事件。

我将只提供一些示例代码,以便您体验一下。 您的部分示例代码可能如下所示。

用户有很多事件:

User = Backbone.RelationalModel.extend({
    relations: [
        type: Backbone.HasMany,   // Type of relationship
        key: 'events',            // How we reference the sub-models in collection
        relatedModel: 'Event',    // The sub-model type
        collectionType: 'EventCollection',  // The sub-model collection
        reverseRelation: {
            key: 'belongsToUser'            // Key we use to refer to the parent
        }
    ],
    // Other Backbone.Model properties and functions
});

当您创建主干关系模型时,它会自动为您创建一个以您指定的“键”命名的子模型集合。因此,您拥有的每个用户都将拥有自己整理的相关事件集合。

基本上,当您创建或获取用户时,您会为其提供对所需相关模型的引用。因此,例如,您的用户 id=1 可能需要事件 5、7 和 11。(我只是使用 ID)。只要这些引用以数组形式定义,您就可以使用 Relational 的 fetchRelated 方法延迟加载它们。

myUser = new User();
myUser.set({
    name: 'RayMysterio',
    age: '26',
    events: [5, 7, 11]    // Or this might just come with the User object from your server
});

myUser.fetchRelated('events');
// This will go fetch the related events for this user model from the URL you designate.

myUser.get('events');
// The collection of events are treated like an attribute of the User model.

myUser.get('events').find(function(eventModel){
    return // some find condition - or whatever you want to do on that collection
});

您可能希望将某些监听器绑定(bind)到子模型。

myUser.bind('add:events', function(model, collection) {
    // Whatever code you want to happen when new models are added to the user events coll
});

等等。等等

这是生成一对一、一对多和反向关系的好方法。这很关键。当您定义模型之间的关系并创建模型时。

例如您创建了一个新的用户模型实例。

Backbone-relational 自动创建反向链接(事件模型有一个由反向关系键'belongsToUser'(或任何你命名的)定义的属性。这使得上下遍历模型/子模型非常方便层次结构。

根据您的关系需求,这似乎很合适。

如果你想要多对多,有一种迂回的方式(使用中间模型),但我发现这有点靠不住,我避免了它。 Paul-Uithol 更新 Backbone-Relational 已经有一段时间了,并且不断添加新功能。一开始学习曲线对我来说有点困难,但一旦你开始习惯它,它就会非常方便。

注意:只是强调一下,Mosselman 推荐了 Require.js,我也非常同意这一点。它使我的代码更易于管理。您可以修补(包装)Backbone 关系代码以使其符合 AMD 标准,并且它可以完美地与 Require 一起工作。

更新:从 2014 年 4 月 1 日发布的 0.8.8 版开始,backbone-relational 现在支持 require.js - 感谢 Kenneth

关于javascript - 如何处理 backbone.js 中的关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10871369/

相关文章:

azure - OneDrive API 和 Azure Active Directory 设置以作为个人帐户上传

javascript - backbone.js 和 Handlebars :string is not a function

javascript - 继承后无法构造 Javascript 对象(在对象内)

c# - 使用发布数据填充部分 View

javascript - 如何使用 sinon.stub 将单元测试写入 "request"节点模块?

javascript - 如何在包含其他内容的字符串中查找电话号码?

java - “无法通过外部浏览器访问 URL。”在部署 RESTful Web 服务时

c# - 为什么 Process.Start 会产生 ANSI 转义码

javascript - ListenTo在Backbone中的实现

javascript - Backbone.Js - el 和 $el 有什么区别?