gpt4 book ai didi

javascript - 应该如何在 Backbone.js 中处理关联更改?

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:36:00 26 4
gpt4 key购买 nike

假设我有一个包含两个集合的应用程序: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 扩展)

最佳答案

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

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 参数并执行其业务。

关于javascript - 应该如何在 Backbone.js 中处理关联更改?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9595752/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com