就像@mu_is_too_short 评论的那样,骨干关系可能是您有兴趣研究的东西。使用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
});
您可能希望将某些侦听器绑定到子模型。
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 已经更新 Backbone-Relational 已有一段时间了,并且不断添加新功能。起初学习曲线对我来说有点困难,但一旦你开始习惯它就会非常方便。
注意:为了强调一点,Mosselman 推荐了 Require.js,我也非常同意这一点。它使我的代码更易于管理。您可以修改(包装)Backbone 关系代码以使其符合 AMD 标准,并且可以与 Require 完美配合。
更新:骨干关系现在支持 require.js,从 2014 年 4 月 1 日的 0.8.8 版开始 - 感谢 Kenneth