thirdHelping = Backbone.Model.extend({
url: 'donut'
});
thirdHelping.set({id:15}); // Set the id attribute of model to 15
thirdHelping.fetch(); // Backbone assumes this model exists on server as ID 15
$app->get('/donut/:id', function($id) use ($app) {
// get donut model with id of $id from database.
$donut = ...
// Looks something like this maybe:
// $donut = array('id'=>7, 'flavor'=>'chocolate', 'price'=>'1.00')
$response = $app->response();
$response['Content-Type'] = 'application/json';
$response->body(json_encode($donut));
});
$app->post('/donut', function() use ($app) {
// Code to create new donut
// Returns a full donut resource with ID
});
$app->put('/donut/:id', function($id) use ($app) {
// Code to update donut with id, $id
$response = $app->response();
$response->status(200); // OK!
// But you can send back other status like 400 which can trigger an error callback.
});
$app->delete('/donut/:id', function($id) use ($app) {
// Code to delete donut with id, $id
// Bye bye resource
});
Cake = Backbone.Model.extend({
defaults: {
type: 'plain',
nuts: false
},
url: 'cake'
});
myCake = new Cake();
myCake.toJSON() // Shows us that it is a plain cake without nuts
myCake.save({type:'coconut', nuts:true}, {
wait:true,
success:function(model, response) {
console.log('Successfully saved!');
},
error: function(model, error) {
console.log(model.toJSON());
console.log('error.responseText');
}
});
// ASSUME my server is set up to respond with a status(403)
// ASSUME my server responds with string payload saying 'we don't like nuts'
这个例子有几个不同的地方。你可以在我的蛋糕上看到,而不是set()在保存之前,我简单地将新属性传递给我的保存调用。Backbone非常擅长到处处理JSON数据,并且像冠军一样处理它。所以我想用椰子和坚果来保存我的蛋糕。无论如何,我传递了两个对象来保存。JSON对象的属性和一些选项。第一个,{wait:true}表示在服务器端成功之前不要更新我的客户端模型。当服务器成功返回响应时,将发生成功回调。但是,由于这个示例导致了一个错误(状态不是200将指示Backbone使用错误回调),我们得到了一个没有更改的模型表示。它应该仍然是普通的,没有nuts。我们还可以访问服务器返回的错误对象。我们返回了一个字符串,但它可能是具有更多属性的JSON错误对象。它位于error.responseText属性中。是的,“我们不喜欢nuts。” 恭喜您。您已经完成了从建立模型到在服务器端保存模型的第一次完整的往返。我希望这个史诗般的答案能让您了解这一切是如何结合在一起的。当然,这里有很多细节我已经略过不谈,但是 Backbone.js 保存、REST风格的动词、服务器端操作回复在这里。继续浏览 Backbone.js 文档(与其他文档相比,这本书非常容易阅读),但请记住,这需要时间来理解。你越是坚持,你就会越流利。我每天都会用 Backbone.js 学到一些新的东西,当你开始跳跃,看到你在这个框架中的流利程度不断提高时,它会变得非常有趣。:-) 编辑:可能有用的资源: 关于SO的其他类似回答:How to generate model IDs with Backbone 在静止模式下:http://rest.elkstein.org/http://www.infoq.com/articles/rest-introductionhttp://www.recessframework.org/page/towards-restful-php-5-basic-tips
1条答案
按热度按时间r7s23pms1#
基本上,模型有一个称为attributes的属性,它是一个特定模型可能拥有的各种值。Backbone使用JSON对象作为一种简单的方法,使用各种接受JSON对象的方法来填充这些值。例如:
有几种方法可以填充模型,例如,可以通过传入JSON或使用set()方法来设置模型示例,该方法接受一个JSON对象的属性。
所以这就把我们带到了保存模型和将它们持久化到服务器上。关于“什么是REST/RESTful?”有一大堆细节,在这里很难用一个简短的简介来解释所有这些。特别是关于REST和 Backbone 网保存,你需要理解的是HTTP请求的语义和你对数据做了什么。
您可能已经习惯了两种HTTP请求:GET和POST。在RESTful环境中,这些动词对于Backbone假定的特定用途有特殊的含义。当您想从服务器获取某个资源时,(例如我上次保存的甜甜圈模型、博客条目、计算机规范),并且该资源存在,则执行GET请求。相反,当您要创建新资源时,可以使用POST。
在我进入Backbone之前,我从来没有接触过下面两个HTTP请求方法:PUT和DELETE。这两个动词对Backbone也有特定的含义。当你想更新一个资源时,(例如,把柠檬甜甜圈的味道改为利蒙甜甜圈,等等),你使用PUT请求。当你想从服务器上删除那个模型时,你使用DELETE请求。
这些基础知识非常重要,因为对于REST风格的应用,您可能会有一个URI指定,它将根据您使用的请求 predicate 类型执行相应的任务。例如:
如果我对那个URI做一个GET,它会得到一个ID为17的donut model。:id取决于你在服务器端保存它的方式。这可能只是你的数据库表中的donut资源的ID。
如果我用新的数据对那个URI做PUT,我会更新它,保存它。如果我对那个URI做DELETE,那么它会从我的系统中清除它。
对于POST,由于您还没有创建资源,因此它没有一个已建立的资源ID。我希望创建资源的URI目标可能很简单:
URI中没有ID片段。所有这些URI设计都取决于您以及您如何考虑资源。但是对于REST风格的设计,我的理解是您希望将操作的动词保留为HTTP请求,而将资源保留为名词,这使得URI易于阅读并且对人类友好。
你还在听我说话吗?:-)
让我们回到Backbone的问题上来。Backbone很棒,因为它为你做了很多工作。为了保存我们的甜甜圈和第二个帮助,我们简单地这样做:
Backbone是智能的。如果你刚创建了一个甜甜圈资源,它不会有来自服务器的ID。它有一个叫做cID的东西,这是Backbone内部使用的,但是因为它没有正式的ID,它知道它应该创建一个新的资源,它发送一个POST请求。如果你从服务器获得你的模型,如果一切都是正确的,它可能会有一个ID。在这种情况下,当你保存()时,Backbone假设你想更新服务器,它会发送一个PUT。要获取一个特定的资源,你可以使用Backbone方法.fetch(),它会发送一个GET请求。当你在一个模型上调用.destroy()时,它会发送一个DELETE。
在前面的例子中,我从来没有明确告诉Backbone URI在哪里,让我们在下一个例子中这样做。
Backbone.js 将在
http://localhost:8888/donut/15
获得第三个帮助它将简单地添加/donut茎到您的站点根。如果你还和我在一起,那就好。我想。除非你感到困惑。但我们还是要继续前进。第二部分是服务器端。我们已经讨论了HTTP的不同动词以及这些动词背后的语义。这些语义是你、 Backbone 网和你的服务器必须共享的。
你的服务器需要了解GET,POST,PUT和DELETE请求之间的区别。正如你在上面的例子中看到的,GET,PUT和DELETE都可以指向同一个URI
http://localhost:8888/donut/07
除非你的服务器可以区分这些HTTP请求,否则它会很困惑该如何处理这些资源。这时候你就开始考虑RESTful服务器端代码了。有些人喜欢Ruby,有些人喜欢.net,我喜欢PHP。特别是我喜欢SLIM PHP微框架。SLIM PHP是一个微框架,它有一个非常优雅和简单的工具集来处理RESTful活动。你可以定义路由(URI),根据调用是GET、POST、PUT还是DELETE,它将执行正确的代码。还有其他类似于SLIM的解决方案,如Recess,Tonic。我相信像Cake和CodeIgniter这样的大框架也能做类似的事情,尽管我喜欢Minimal。我说过我喜欢Slim吗?- )
这就是服务器上的摘录代码可能的样子(即,特别是关于路由的代码)。
这里需要注意的是,Backbone需要一个JSON对象。总是让你的服务器将content-type指定为“application/json”,并尽可能将其编码为json格式。这样,当Backbone接收到JSON对象时,它就知道如何填充请求它的模型。
对于SLIM PHP,路径的操作与上面的非常相似。
所以你几乎完成了全程!去拿一杯苏打水。我喜欢健怡山露。也给我拿一杯。
一旦服务器处理了一个请求,对数据库和资源做了一些事情,准备了一个响应(无论是简单的http状态号还是完整的JSON资源),然后数据返回到Backbone进行最终处理。
使用保存()、fetch()等方法--你可以在成功和错误时添加可选的回调函数。下面是我如何设置这个蛋糕的一个例子:
这个例子有几个不同的地方。你可以在我的蛋糕上看到,而不是set()在保存之前,我简单地将新属性传递给我的保存调用。Backbone非常擅长到处处理JSON数据,并且像冠军一样处理它。所以我想用椰子和坚果来保存我的蛋糕。无论如何,我传递了两个对象来保存。JSON对象的属性和一些选项。第一个,{wait:true}表示在服务器端成功之前不要更新我的客户端模型。当服务器成功返回响应时,将发生成功回调。但是,由于这个示例导致了一个错误(状态不是200将指示Backbone使用错误回调),我们得到了一个没有更改的模型表示。它应该仍然是普通的,没有nuts。我们还可以访问服务器返回的错误对象。我们返回了一个字符串,但它可能是具有更多属性的JSON错误对象。它位于error.responseText属性中。是的,“我们不喜欢nuts。”
恭喜您。您已经完成了从建立模型到在服务器端保存模型的第一次完整的往返。我希望这个史诗般的答案能让您了解这一切是如何结合在一起的。当然,这里有很多细节我已经略过不谈,但是 Backbone.js 保存、REST风格的动词、服务器端操作回复在这里。继续浏览 Backbone.js 文档(与其他文档相比,这本书非常容易阅读),但请记住,这需要时间来理解。你越是坚持,你就会越流利。我每天都会用 Backbone.js 学到一些新的东西,当你开始跳跃,看到你在这个框架中的流利程度不断提高时,它会变得非常有趣。:-)
编辑:可能有用的资源:
关于SO的其他类似回答:How to generate model IDs with Backbone
在静止模式下:http://rest.elkstein.org/http://www.infoq.com/articles/rest-introductionhttp://www.recessframework.org/page/towards-restful-php-5-basic-tips