正如@mu_is_too_short所评论的那样,Backbone-relational可能是您有兴趣了解的内容。使用Backbone-relational,您的模型和子模型集合会自动创建,并且可以跨父子关系管理事件。
我将为您提供一些示例代码,以便您可以尝试一下。
您的示例代码可能如下所示。
User有多个Events:
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
});
当你创建一个Backbone-relational模型时,它会自动为你创建一个子模型的集合,集合的名称由您指定的“键”命名。所以你拥有的每个用户都将拥有其自己的相关事件集合。
基本上,当你创建或获取用户时,你要为它提供它需要的相关模型的引用。例如,你的用户id=1可能需要Event 5、7和11。只要这些引用以数组形式定义,就可以使用Relational的fetchRelated方法进行惰性加载。
myUser = new User();
myUser.set({
name: 'RayMysterio',
age: '26',
events: [5, 7, 11]
});
myUser.fetchRelated('events');
myUser.get('events');
myUser.get('events').find(function(eventModel){
return
});
您可能希望将某些监听器绑定到子模型上。
myUser.bind('add:events', function(model, collection) {
});
这是一种很好的方式来创建一对一、一对多和反向关系。这很重要。当你定义模型之间的关系并创建一个模型时,Backbone-relational会自动创建反向链接(例如,Event模型具有一个由反向关系键“belongsToUser”(或任何你命名的键)定义的属性)。这使得在模型/子模型层次结构中向上和向下遍历非常方便。
根据你的关系需求,这似乎是一个很好的选择。
如果你想要多对多的关系,有一种绕路的方法(使用中间模型),但我发现这种方法有点奇怪,所以我避免使用它。Paul-Uithol一直在更新Backbone-Relational,并不断添加新功能。学习曲线一开始可能有些难,但一旦你开始习惯它,它就非常方便。
注意:强调一下,Mosselman推荐使用Require.js,我也非常赞同。它使我的代码更易管理。你可以修改Backbone-relational代码使其符合AMD,并且它能够无缝地与Require一起使用。
更新:backbone-relational现在支持require.js,版本为2014年4月1日的0.8.8版-感谢Kenneth。
myUser.set('events', [myEvent1, myEvent2, myEvent3]);
?还是必须通过相关模型的ID引用关系? - Jake Wilson