Javascript 如何处理backbone.js中的关系

Javascript 如何处理backbone.js中的关系,javascript,rest,backbone.js,backbone-relational,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 ha

我一直在研究如何根据模型关系设计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
好的,所以我的想法是当用户加载页面时加载事件列表,当用户单击事件时加载关于该事件的其余信息(评论、参与和用户)

所以问题是,我是否应该使用某种全局变量来保存所有事件、用户等,当我从服务器获取信息时,将其放在那里(并在我从服务器获取信息之前进行检查),可能放在某种本地存储中(我如何使用关系骨干网实现这一点?)

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

你推荐什么方法


谢谢

理论上,您可以加载所有单独的集合,然后在进行渲染时对集合使用本地过滤来获取相关模型

当然,你必须考虑安全问题。

至少对我来说,从你的问题来看,我不太清楚你将如何处理你所获取的信息,但我会尽力回答你

我的假设是,您有一些带有额外数据的事件,您需要显示与此相关的信息。然后你还需要能够做一些事情,比如添加评论,等等

正如我所说,你可以考虑做以下事情:

var Events = Backbone.Collection.extend({
    url: '/events', // You might want to let the app return only an account's events or something, not just ALL events.
    initialize: function(){
        this.fetch();
    }
});

var Comments = Backbone.Collection.extend({
    url: '/comments',
    initialize: function(){
        _.bindAll(this, 'getEventComments');
        this.fetch();
    },

    getEventComments: function(event_id){
        return _.filter(this.models, function(model){ return model.get('event_id') == event_id; });
    }
});
//etc
通过使用下划线的过滤函数,您可以在每次需要时(例如渲染时)非常快速地获取相关模型

在某种程度上,这与您在服务器端脚本中所做的相同。有些数据库保存所有包含记录的表,就像这里的集合一样,代码只是根据一些输入向数据库请求相关的记录

最后,我将始终向人们指出Require.js与主干网的结合。厚颜无耻地参考我今天给出的答案,看看吧,无论发生什么,它都会让生活变得更轻松:

就像@mu_太短了一样,主干关系可能是你感兴趣的东西。使用您的模型和子模型,将自动创建集合,并且可以跨父子关系管理事件

我会给你一些示例代码,让你可以尝试一下。 示例代码的一部分可能如下所示

用户有许多事件:

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。(我只是在用身份证)。只要这些引用是以数组形式定义的,那么就可以使用关系数据库的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
});
您可能希望将某些侦听器绑定到子模型

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

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

例如,创建用户模型的新实例

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

基于您的关系需求,这似乎是一个很好的选择

如果您想要多对多,有一种循环的方法(使用中间模型)但我发现这有点不可靠,我避免了。Paul Uithol已经更新主干关系有一段时间了,新功能不断增加。开始学习曲线对我来说有点难,但一旦你开始习惯它,它就非常方便了

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


更新:自2014年4月1日发布的0.8.8版起,主干关系网现在支持require.js-感谢Kenneth

是否可以通过事件模型将事件与用户关联?
myUser.set('events',[myEvent1,myEvent2,myEvent3])
类似的内容?或者您必须通过相关模型id引用关系?@orangewarp主干关系从2014年4月1日的0.8.8版开始,现在支持require.js。请参阅