Backbone中的model和collection在做save或者create操作时, 如何选择用POST还是PUT方法 ?
Model和Collection和后台的WEB server进行数据同步非常方便, 都只需要在实行里面添加一url就可以了,backbone会在model进行save或者collection进行create时,自动将数据用POST或者PUT方式通过该url发送到后端。按照POST和PUT的含义,backbone采用的原则是: 如果model数据为一个全新的实例,则使用POST请求;如果model数据是一个已经存在的实例, 单需要修改实例属性,则采用PUT请求。
所以,问题的关键是,backbone判断实例数据是新旧的依据是什么? backbone采用了以下几种约定:
1. 如下的Model类User,由于不存在键值属性,那么就认为是新实例对象,在save或者create时,就用POST请求。
var User = Backbone.Model.extend({
initialize: function(user) {
},
defaults: {
uid: "",
name: ""
},
url:"/users/",
});
var UserList = Backbone.Collection.extend({
url: "/users",
load: function() {
}
});
var userList = new UserList(User)
var userList.create({uid: "a", name:"Peter"}); //通create在userList中新建一个user并发送POST请iutongbu
var bill = new User({uid: "b", name:"Bill"}); //只在JS端创建了Model。单还没同步到后端
bill.save(); //save触发POST请求同步
userList.add(bill); //只是将JS的bill实例加入userList,不触发HTTP请求
2. 如下的Model类User,uid被定义为键值属性,创建实例时, uid为空,那么也是新实例对象,在save或者create时,就用POST请求。
var User = Backbone.Model.extend({
initialize: function(user) {
},
defaults: {
uid: "",
name: ""
},
idAttribute:"uid", //uid被定义为键值属性
url:"/users/",
});
var UserList = Backbone.Collection.extend({
url: "/users",
load: function() {
}
});
var userList = new UserList(User)
var userList.create({name: "Peter"}); //键值uid未设值, backbone认为是新实例,所以通create在userList中新建一个user并发送POST请求同步
var bill = new User({name: "Bill"});
bill.save(); //键值uid未设值, backbone认为是新数据, 所以, save也触发POST请求同步
3. 如下的Model类User,uid被定义为键值属性,创建实例时, uid不为空,在save或者create时,就用PUT请求。
var User = Backbone.Model.extend({
initialize: function(user) {
},
defaults: {
uid: "",
name: ""
},
idAttribute:"uid", //uid被定义为键值属性
url:"/users/",
});
var UserList = Backbone.Collection.extend({
url: "/users",
load: function() {
}
});
var userList.create({uid: "a", name:"Peter"}); //由于存在键值uid, 所以通create在userList中新建一个user并发送PUT请求同步
var bill = new User({uid: "b", name:"Bill"}); //只在JS端创建了Model。单还没同步到后端
bill.save(); //由于存在键值uid, 所以, save也触发PUT请求同步
4. Backbone中,键属性除了用显示的idAttribute定义以外,还有一个隐式的约定,即如果model的属性里面有个"id", 那么这个"id"属性就是键属性。所以以下定义的User虽然没有显示定义键属性,但却是有键值的,所以同步后台时会发送PUT请求
var User = Backbone.Model.extend({
initialize: function(user) {
},
defaults: {
id: "",
name: ""
},
url:"/users/",
});
var UserList = Backbone.Collection.extend({
url: "/users",
load: function() {
}
});
var userList = new UserList(User)
var userList.create({id: "a", "Peter"}); //由于存在键值id, 所以通create在userList中新建一个user并发送PUT请求同步
var bill = new User({id: "b", "Bill"}); //只在JS端创建了Model。单还没同步到后端
bill.save(); //由于存在键值id, 所以, save也触发PUT请求同步
5. 以上任何一种约定,backbone内部的判断逻辑其实都在isNew()方法中, isNew()是Model内部的一个方法, 返回值为true,表示为新实例,save/create触发POST请求; 返回值为false, save/create触发PUT请求。如下,虽然设有隐式的id键属性,单由于重载后的isNew()方法始终返回true, 所以依然触发POST请求
var User = Backbone.Model.extend({
initialize: function(user) {
},
defaults: {
id: "",
name: ""
},
url:"/users/",
isNew:function() {
return true;
}
});
var UserList = Backbone.Collection.extend({
url: "/users",
load: function() {
}
});
var userList = new UserList(User)
var userList.create({id: "a", name:"Peter"}); //由于isNew()返回值为true, 所以通create在userList中新建一个user并发送POST请求同步
var bill = new User({id: "b", name:"Bill"});
bill.save(); //由于isNew()返回值为true所以, save也触发POST请求同步
另外需要注意的是,发送PUT时, URL请求后面会自动加上键值,变成“/users/a”,由于没有键值,所以POST实际发送的url和定义时一样
Backbone中的model和collection在做save或者create操作时, 如何选择用POST还是PUT方法 ?的更多相关文章
- 关于DOM中的model(将元素转成对象进行操作)
DOM document (html, xml) object 将文档中的HTML元素转成js的对象 通过ID找到文档的元素转成js对象 var obj = document.getElementBy ...
- Backbone学习笔记 - Model篇
2 Model 在Backbone中,Model用于存储核心数据,可以将数据交互相关的逻辑代码放在这里.基本形式如下: var Human = Backbone.Model.extend({ init ...
- Backbone.js 中使用 Model
前面几篇 Backbone.js 的例子中有使用到 template, 及数据的填充,其实这已经很接近 Model 了.现在来学习怎么创建自己的 Model 类,并简单的使用.Backbone.js ...
- Backbone.js 中的Model被Destroy后,不能触发success的一个原因
下面这段代码中, 当调用destroy时,backbone会通过model中的url,向服务端发起一个HTTP DELETE请求, 以删除后台数据库中的user数据. 成功后,会回调触发绑定到dest ...
- Qt的Model/View Framework解析(数据是从真正的“肉(raw)”里取得,Model提供肉,所以读写文件、操作数据库、网络通讯等一系列与数据打交道的工作就在model中做了)
最近在看Qt的Model/View Framework,在网上搜了搜,好像中文的除了几篇翻译没有什么有价值的文章.E文的除了Qt的官方介绍,其它文章也很少.看到一个老外在blog中写道Model/Vi ...
- backbone库学习-model
backbone库的结构: http://www.cnblogs.com/nuysoft/archive/2012/03/19/2404274.html 本文所有例子来自于http://blog.cs ...
- Backbone学习笔记一Backbone中的MVC
原文章地址http://bigdots.github.io/2015/12/01/Backbone学习笔记(一)/#more Backbone.js为复杂WEB应用程序提供模型(models).集合( ...
- 如何在springMVC 中对REST服务使用mockmvc 做测试
如何在springMVC 中对REST服务使用mockmvc 做测试 博客分类: java 基础 springMVCmockMVC单元测试 spring 集成测试中对mock 的集成实在是太棒了!但 ...
- Backbone中 View之间传值的解决办法
Backbone中的View就是用来展示由Model层传出的数据,或者在View里产生的一些数据,包括输入框中输入等产生的数据,由当前View传递到另外一个View层里,应该怎么办呢,我之前读到一位博 ...
随机推荐
- 软件工程(C编码实践篇)学习心得
孟繁琛 + 原创作品转载请注明出处 + <软件工程(C编码实践篇)>MOOC课程 http://mooc.study.163.com/course/USTC-1000002006 软件工程 ...
- ORA-00821: Specified value of sga_target 3072M is too small, needs to be at least 12896M
在测试PlateSpine克隆的数据库服务器时,由于资源有限,克隆过来的数据库服务器只给了9G的内存,结果在测试时,老是会出现OOMkiller导致宕机,即out of memory killer,是 ...
- VMware下对虚拟机Ubuntu14系统所在分区sda1进行磁盘扩容
VMware下对虚拟机Ubuntu14系统所在分区sda1进行磁盘扩容 一般来说,在对虚拟机里的Ubuntu下的磁盘进行扩容时,都是添加新的分区,而并不是对其系统所在分区进行扩容,如在此链接中http ...
- mysql 大表拆分成csv导出
最近公司有一个几千万行的大表需要按照城市的id字段拆分成不同的csv文件. 写了一个自动化的shell脚本 在/home/hdh 下面 linux-xud0:/home/hdh # lltotal 1 ...
- 纯JS打造比QQ空间更强大的图片浏览器-支持拖拽、缩放、过滤、缩略图等
在线演示地址(打开网页后,点击商家图册): http://www.sport7.cn/cc/jiangnan/football5.html 先看一看效果图: 该图片浏览器实现的功能如下: 1. 鼠标滚 ...
- Spring cookie 实战
测试环境搭建 使用Springboot构建web server, 在测试方法中打印接收的cookie. @RestController @RequestMapping("/register/ ...
- 基于 SailingEase WinForm Framework 开发优秀的客户端应用程序(目录)
本系统文章将详细阐述客户端应用程序的设计理念,实现方法. 本系列文章以 SailingEase WinForm Framework 为基础进行设计并实现,但其中的设计理念及方法,亦适用于任何类型的客 ...
- Java在DOS命令下的运行及其API文档制作过程
该文档主要描述java程序在DOS命令下的运行,以及一些常用的命令 常用DOS命令: d: 回车 盘符切换 dir(directory):列出当前目录下的文件以及文件夹 md (make direct ...
- Centos6.5中安装和配置vsftp详细总结
一.vsftp安装篇 #查看是否安装:rpm -qa|grep vsftpd#卸载vsftpdrpm -e vsftpd-2.2.2-11.el6_3.1x86_64 --nodeps# 安装vsft ...
- Sql Server系列:规范化及基本设计
1 理解表 表是具有相同常规属性(attribute)的数据实例的集合.这些数据实例组成数据行和列. 2 数据表设计范式 2.1 第一范式 第一范式(1NF)是关于消除重复数据组和保证原子性的规范化. ...