集合上的骨干关系函数

时间:2012-07-31 00:00:58

标签: backbone.js backbone-relational

我正在做一个有点大的骨干网络应用程序,我正在使用骨干关系。我想知道我是否可以在一对多关系中使用自定义函数。

即。如果我有一个国家模型,它与多个元数据模型(每个类型属性)相关,我想创建一个函数来将相关集合过滤到某种类型。这不是最好的例子(我不想公开提到项目的细节),但这里是我做的一些示例代码(它可能不是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'

有人知道你能不能这样做?如果有另一种好方法可以做到这一点(同时仍然保持同一系列中的不同类型),我很想知道。

谢谢!

2 个答案:

答案 0 :(得分:1)

创建单独对象以充当集合代理的常规模式。代理包含对基本集合的引用以及包含简化集的自己的集合。然后,此代理侦听基本集合上的事件,并相应地更新过滤的集合,并根据需要转发事件。有了这个,您可以通常从基本集合添加,更新和删除模型,让代理根据需要自行更新,并将您的视图或使用过滤集合的任何内容连接到代理。

由于手动操作有点麻烦且容易出错,我建议使用此库:https://github.com/jmorrell/backbone.obscura

如果您熟悉关系数据库中View的概念,那就是同样的想法。

答案 1 :(得分:-1)

countries.at(1).get('metas').filterType('landmark')