【问题标题】:How should association changes be handled in Backbone.js?Backbone.js 中应该如何处理关联更改?
【发布时间】:2012-03-11 19:46:07
【问题描述】:

假设我有一个包含两个集合的应用程序:UsersTasks。这些之间存在多对多关联——一个任务可以与任意数量的用户关联,反之亦然。处理新关联的最佳方式是什么?

一种方法是为每个用户分配一个新的任务集合:

Users = Backbone.Model.extend({
  this.tasks = new Tasks;
  ...
});

然后使用模型(或副本)作为输入执行this.tasks.create()

这样做的问题是任务应该已经有一个ID。如果模型有 id,Backbone 想要进行更新。所以不是这样的:

POST /users/156/tasks

你会得到这样的东西:

PUT /users/156/tasks/15

这不是你想要的。您可以为该模型重新定义 isNew() 函数以让 Backbone 执行 POST,但这似乎是一种 hack。

另一种方法是在两端维护一个 id 列表。例如,User 模型 JSON 可能如下所示:

{
  username: "jsmith"
  name: "Joe Smith"
  tasks: [5, 15, 256]
}

只需从要添加的模型中获取 ID,然后对用户执行 PUT。

这里的问题是更多的数据是通过网络发送的,而具体的变化没有体现出来。服务器必须做更多的工作来过滤模型,找出改变了什么,并根据需要添加/删除关联(这里的后端是 SQL,所以我们不只是处理嵌入式任务列表或任何东西)。请求所需的特定关联更改似乎要好得多。

那么哪种方法看起来最好呢?还有其他我没有考虑的选择吗?

(注意:我想避免像 Backbone-relational 这样的 Backbone 扩展)

【问题讨论】:

  • 您可以保持无状态,只需使用 options.data 哈希获取每次使用的任务集合。
  • 我不确定我是否理解为什么创建一个任务时会有一个 id
  • 这一切都取决于你用它做什么,取决于你绑定到的事件,在某些事件上执行的代码,如果你有一个集合作为每个的子参数,可能会影响性能用户,虽然我没有确凿的数据。我想知道为什么选择避免骨干关系?
  • @Uzi 任务有 ids,在这个示例所基于的应用程序中,因为它们都已被持久化到服务器。
  • @Sander 骨干关系 看起来它引入了相当多的额外复杂性和魔力;我想避免为其他开发人员(和我自己)引入另一个障碍来理解该应用程序。

标签: javascript backbone.js


【解决方案1】:

对于这些情况,我创建了一个处理关系而不是它们自己的对象的特定路由,例如:

POST /users/156/tasks_relations

使用这种方法,我们更接近于纯 REST API,因为事实上我们所做的不是 CREATING(POST) Task 而是 CREATING(POST) TaskRelation

在 Backbone 中,我还有一个特定的 TaskRelation 模型来表示关系:

// code simplified and not tested
var TaskRelation = Backbone.Model.extend({
  urlRoot: function(){
    return this.user.url + "/tasks_relations";
  },

  initialize: function( opts ){
    this.user = opts.user;
  }
});

所以在User 中我们可以像这样向服务器发送一个新的TaskRelation

// code simplified and not tested
var User = Backbone.Model.extend({
  addTask: function( task ){
    var task_relation = new TaskRelation({ user: this, task_id: id });
    task_relation.save();
  }
})

服务器将采用task_id 参数并执行其业务。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-08
    • 1970-01-01
    • 2014-07-07
    • 1970-01-01
    • 1970-01-01
    • 2012-03-19
    • 2011-01-14
    相关资源
    最近更新 更多