【问题标题】:Backbone-associations vs Backbone-relational骨干关联与骨干关系
【发布时间】:2014-08-12 05:49:47
【问题描述】:

我一直在寻找有关如何在 Backbone 中建立关系的信息,并遇到了以下两个不错的插件:

两者似乎都存在两年多了,而且似乎很稳定。但是,Backbone-relational 在以下方面胜过Backbone-associations

  • 提供几乎所有的关系,例如我们在数据库中的one-to-one, one-to-many, many-to-one
  • 乍一看很好的文档(类似于Backbone.js

由于我没有时间深入研究这两个插件,我想从有经验的人那里知道以下事情:

  • 是否都支持 AMD(如 Requirejs)?
  • 该插件与 Ruby on Rails 等后端服务器一起使用有多容易?
  • 实现多态关系有多容易?

【问题讨论】:

  • 那么,你都试过了吗(鉴于没有人回复:/)?在我正在进行的一个新项目中,我们使用 bb-relational(看起来很容易),但我一直在为另一个项目寻找这两个:非常感谢您的反馈......
  • 我正在从关系迁移到关联的过程中,因为关系被证明是一种痛苦,主要是因为它的“存储”阻碍了它。当我知道更多时,我会回复一个答案。只是让你知道这个问题仍然出现:)
  • 我开始在一个大型 BB + marionette 应用程序中使用骨干关系,发现内存泄漏和性能问题。查看了主干关联和 SuperModel,两者看起来都不错...最终只是重写了 get|set 我们自己,不需要这些库所具有的所有“功能”

标签: javascript jquery backbone.js backbone-relational backbone-associations


【解决方案1】:

最大的区别是Backbone-relational 禁止创建具有相同 ID 的同一模型的多个实例。考虑:

let Person = Backbone.RelationalModel.extend({
    relations: [
        type: Backbone.HasMany,
        key: 'likes_movies',
        relatedModel: 'Movie'
    ]
});

let peter = new Person({
    likes_movies: [{id: 1, title: 'Fargo'}, {id: 2, title: 'Adams Family'}]
);

let john = new Person({
    likes_movies: [{id: 1, title: 'Fargo'}, {id: 2, title: 'Adams Family'}]
);

// Change title of one of Peter's movies
peter.get('likes_movies').get(1).set('title', 'Fargo 2 (Sequel)');

// John's corresponding movie will have changed its name
console.log(john.get('likes_movies').get(1)); // Fargo 2 (Sequel)

如果为Backbone-associations 重写,John 的电影标题不会改变。这可以被认为是一个特点或一个缺点,这取决于你如何看待它。

除此之外,这两个库都非常相似,只是 Backbone-associations 的开发似乎在一年前就停止了。

【讨论】:

    【解决方案2】:

    实际上,基于 GitHub 脉冲(活动指标),Backbone-relational 社区似乎更加活跃。

    【讨论】:

      【解决方案3】:

      在为 Backbone 寻找 EmberData 或 Restangular 之类的东西时,我研究了这两个库。

      这两个库都试图弥补 Backbone 的主要弱点:正确处理 Rest API Restful 资源。
      事实上,Backbone 会在每次需要渲染时促进新模型的创建(而不是在应用程序的其他地方重用用于另一个渲染的实例)。
      由于某些模型更新并未在 Web 应用程序的任何地方传播,因此会出现一些不一致。
      然后需要一个主干模型实例的缓存。 Backbone Relational 提供了这样的缓存,但 Backbone Association 没有。

      此外,两者都重新实现了 Backbone 的代码方法(set、get、reset、trigger),因此它们与 Backbone 强耦合。
      这可能会使 Backbone 库迁移变得复杂,特别是如果您在 Backbone 之上使用另一个 MVC 框架(Marionnette、Thorax、Chaplin...)

      就代码行数而言,Backbone Association 比 Backbone Relational 轻(800 对 2000)。

      • Backbone Association 实现更易于调试,因为它直接将关系管理到重载方法(set、get、...)中
      • 相反,Backbone Relational 依靠队列将关系内容与其内部存储同步。这使得调试变得棘手......

      另一个轻量级(但较少使用)替代方案是“Backbone SuperModel”:http://pathable.github.io/supermodel/

      • 这个库由 800 行代码组成,比 Backbone Relational 更容易理解(我自己修复了一个小错误。)
      • 它提供了一个基于 Backbone Collection 的骨干实例缓存

      在我这边,

      • 我成功将最后一个与RequireJs集成
      • 我用它管理一些多态关联
      • 出现了我的 Web 应用程序和我的 Java 后端之间的协议
      • 每次需要时我都会成功升级 Backbone 和 Marionette

      【讨论】: