使用函数来管理Backbone中的关系

时间:2012-06-22 12:52:13

标签: javascript backbone.js backbone-relational

我正在使用Backbone.js(第一次)创建一个相当简单的应用程序。我目前正在与两个具有一对多关系的实体合作:

  • 项目:有很多小组
  • 组:属于一个项目

我看了几种不同的方式来表示模型之间的关系,从Backbone自己的建议到Ligament到Backbone-relational。但是,我最终决定使用简单的函数调用。例如,在我的“Project”模型中,有一个名为groups()的函数:

groups: function() {
  return new Collections.Groups(groups.where({project_id: this.get('id')}));
}

在集团模型中:

project: function() {
  return projects.where({id: this.get('project_id')})[0];
}

这允许我做以下事情:

var foo = new Project();
var foo_groups = foo.groups();
foo_groups.at(0).get('name');

var bar = new Group();
var bar_project = bar.project();
bar_project.get('name');

对我来说,这里的权衡是维持最新关系(当使用骨干关系这样的东西)与每次想要获得项目时调用'groups()'函数的处理时间的开销。基团。

当我以这种方式建立更多关系时,有没有人可以告诉我我可能遇到的任何陷阱,或许推荐一个更好的解决方案(除了上面提到的扩展)?该应用程序最终将拥有大约6个具有各种一对多和多对多关系的实体

1 个答案:

答案 0 :(得分:0)

Project.groups

我实现了我所谓的AutoUpdatedCollection

我在你有一个共享集合的场景中使用它,它包含一个类的每个模型,而这个集合用于填充子集合那些必须是

在更新共享集合时更新。

检查Backbone AutoUpdatedCollection

的实施情况

按照您的示例,我假设有一个名为window.groups公共/共享集合,然后我将实现Project这样的模型:

// code simplified and no tested
var Project = Backbone.Model.extend({
  initialize: function(){
    this.groups =
      new App.AutoUpdatedCollection({
        name:             "Project-" + this.id + "-groups",
        sourceCollection: window.groups,
        filterField:      "project_id",
        filterValue:      this.id
      }).filteredCollection;

    this.groups.on( "add", this.addGroup, this );
    this.groups.on( "remove", this.removeGroup, this );
  }
});

如果你有什么问题请告诉我,也许不是这么简单。

Group.project

我只是初始化Group.project中的Group.initialize()属性:

var Group = Backbone.Model.extend({
  this.project = window.projects.where({id: this.get('project_id')})[0];
});