我正在做一个有点大的基于主干网的web应用程序,并且我正在使用主干网关系。我想知道我是否可以在一对多关系上有一个自定义函数。
I.E.如果我有一个国家/地区模型,并且它与多个元数据模型相关(每个模型都有一个类型属性),并且我想制作一个函数来将相关集合筛选到某个类型。这不是最好的例子(我不想公开提及项目的细节),但下面是我制作的一些示例代码(它可能不是100%正确的,但它实现了这个想法):
var Country = Backbone.RelationalModel.extend({
relations: [
{
type: Backbone.HasMany,
key: 'metas',
relatedModel: Metadata,
collectionType: MetadataCollection,
reverseRelation: {
key: 'country',
includeInJSON: '_id'
}
}
]
});
var Metadata = Backbone.RelationalModel.extend({
subModelTypes: {
'landmark' : 'Landmark',
'city' : 'City'
}
});
var Landmark = Metadata.extend({});
var City = Metadata.extend({})
var MetadataCollection = Backbone.Collection.extend({
model: Metadata,
filterType: function(type){
this.filter(function(meta){
return meta.get('type') === type;
})
}
});
var Countries = Backbone.Collection.extend({
model: Country
})
var countries = new Countries([
{
name: 'Australia',
metas: [
{
type: 'landmark',
name: 'Uluru'
},
{
type: 'landmark',
name: 'Sydney Opera House'
},
{
type: 'city',
name: 'Sydney'
}
]
}
]);
countries.get(1).get('metas').filterType('landmark')
// TypeError: Object [object Object] has no method 'filterType'
有人知道你能不能做到吗?如果有另一种好的方法可以做到这一点(同时仍然将不同的类型保留在同一个集合中),我很想知道。
谢谢!
创建一个单独对象作为集合代理的常规模式。代理包含对基集合的引用以及它自己的包含精简集的集合。然后,此代理侦听基本集合上的事件,并相应地更新筛选的集合,并酌情转发事件。有了这一点,您可以像往常一样从基本集合中添加、更新和删除模型,让代理根据需要更新自己,并将视图或使用过滤集合的任何内容连接到代理。
由于手动操作有点麻烦且容易出错,我建议使用此库:https://github.com/jmorrell/backbone.obscura
如果您熟悉关系数据库中视图的概念,这也是相同的想法。