3

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

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

我研究了几种表示模型之间关系的不同方式,从 Backbone 自己的建议到韧带再到 Backbone-relational。然而,我最终决定使用简单的函数调用。例如,在我的“项目”模型中,有一个名为 groups() 的函数:

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

在 Group 模型中:

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 个实体,具有各种一对多和多对多关系

4

1 回答 1

0

项目组

我有一个我所说的实现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.initialize()

var Group = Backbone.Model.extend({
  this.project = window.projects.where({id: this.get('project_id')})[0];
});
于 2012-08-07T19:37:07.477 回答