我提供了第二个答案,以简化您需要研究的代码,以获得您正在思考的要点 - 从模型到服务器的实际循环以及 id 如何发挥作用。
假设您定义了一个模型 - 让我们使用侏罗纪公园。
// Define your model
var Dinosaur = Backbone.Model.extend({
defaults: {
cavemanEater: undefined // Has one property, nom nom or not.
},
urlRoot: 'dino' // This urlRoot is where model can be saved or retrieved
});
var tRex = new Dinosaur({'cavemanEater':true});
您现在已经实例化了一个食肉恐龙。咆哮。
console.log(tRex);
您应该注意的是,在 tRex 的属性中,您的模型没有 id。相反,您将看到一个 cID,您可以将其视为 Backbone 自动分配给您的模型的临时 id。当模型没有 id 时,它被认为是新的。持久化模型(数据库或本地存储)的概念允许您在创建该资源后返回该资源并执行保存(PUT)或销毁(DELETE)之类的操作。如果您无法再次直接指向该资源,将很难找到该资源!为了找到该资源,您的模型需要一个 ID,它目前没有。
因此,正如上述答案所解释的,为 Backbone 提供资源 ID 是您的数据库(或本地存储或其他解决方案)的工作。大多数情况下,这来自资源 ID 本身,也就是您的模型在某个表中的主键 ID。
通过我的设置,我使用 PHP 和 mySQL。我会有一个名为 Dinosaur 的表,每一行都是我的恐龙模型的持久表示。所以我有一个 id 列(唯一的自动递增 int)和cavemanEater(bool)。
数据通信流程是这样发生的。
- 您创建一个模型。
- 模型是新的,所以它只有一个 cID - 没有正确的 ID。
- 您保存模型。
- 模型的 json 表示已发送到您的服务器 (POST)
- 您的服务器将其保存到表中并为其提供资源 ID。
- 您的服务器发回数据 {id:uniqueID} 的 json 表示
- Backbone 接收到这个带有 id 的 json 表示
- Backbone 使用 id 自动更新您的模型。
这是带注释的代码的样子。
客户:
tRex.save();
// {'cavemanEater':true} is sent to my server
// It uses the urlRoot 'dino' as the URL to send. e.g. http://www.example.com/dino
服务器:
// Is setup to accept POST requests on this specific ROUTE '/dino'
// Server parses the json into something it can work with, e.g. an associative array
// Server saves the data to the database. Our data has a new primary id of 1.
// Data is now persisted, and we use this state to get the new id of this dino.
$dinoArray = array('id'=>1, 'cavemanEater'=>true);
$dinoJSON = json_encode($dinoArray);
// Server does something to send $dinoJSON back.
客户:
// If successful, receives this json with id and updates your model.
现在您的 tRex 的 id = 1。或者我应该说...
tRex.toJSON();
// RETURNS {'id':'1', 'cavemanEater':'true'}
恭喜。如果你这样做 tRex.isNew() 它将返回 false。
Backbone 很聪明。它知道 POST 新模型和 PUT 已经有资源 id 的模型。
下次你这样做时:
tRex.save();
Backbone 将向以下 URL 发出 PUT 请求。
http://www.example.com/dino/1
顺便说一句,这是默认行为。但是您会注意到 URL 与保存不同。在服务器上,您需要一个接受 /dino/:id 而不是 /dino
的路由
默认情况下,它会为您的模型使用 /urlRoot/:id 路由模式,除非您另行调整。
不幸的是,恐龙已经灭绝了。
tRex.destroy();
这将调用...你能猜到吗?是的。对 /dino/1 的删除请求。
您的服务器必须区分对不同路由的不同请求才能使 Backbone 工作。有几种服务器端技术可以做到这一点。
如果您使用 Ruby,有人提到了 Sinatra。就像我说的,我使用 PHP,我使用 SLIM PHP Framework。它的灵感来自 Sinatra,所以很相似,我喜欢它。作者写了一些干净的代码。不过,这些 RESTful 服务器实现的工作原理超出了本次讨论的范围。
我认为这是没有 id 的新 Backbone 数据的基本完整传输,通过 Internet 到它生成的服务器,然后发回资源 id,让你的模型从此过上幸福的生活。 (或者destroy()不是……)
我不知道这对你来说是否太初学者,但希望它能帮助遇到这个问题的其他人。使用 Backbone 进行编程真的很有趣。
其他类似的答案:
Ways to save Backbone JS model data