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方法 ?的更多相关文章

  1. 关于DOM中的model(将元素转成对象进行操作)

    DOM document (html, xml) object 将文档中的HTML元素转成js的对象 通过ID找到文档的元素转成js对象 var obj = document.getElementBy ...

  2. Backbone学习笔记 - Model篇

    2 Model 在Backbone中,Model用于存储核心数据,可以将数据交互相关的逻辑代码放在这里.基本形式如下: var Human = Backbone.Model.extend({ init ...

  3. Backbone.js 中使用 Model

    前面几篇 Backbone.js 的例子中有使用到 template, 及数据的填充,其实这已经很接近 Model 了.现在来学习怎么创建自己的 Model 类,并简单的使用.Backbone.js ...

  4. Backbone.js 中的Model被Destroy后,不能触发success的一个原因

    下面这段代码中, 当调用destroy时,backbone会通过model中的url,向服务端发起一个HTTP DELETE请求, 以删除后台数据库中的user数据. 成功后,会回调触发绑定到dest ...

  5. Qt的Model/View Framework解析(数据是从真正的“肉(raw)”里取得,Model提供肉,所以读写文件、操作数据库、网络通讯等一系列与数据打交道的工作就在model中做了)

    最近在看Qt的Model/View Framework,在网上搜了搜,好像中文的除了几篇翻译没有什么有价值的文章.E文的除了Qt的官方介绍,其它文章也很少.看到一个老外在blog中写道Model/Vi ...

  6. backbone库学习-model

    backbone库的结构: http://www.cnblogs.com/nuysoft/archive/2012/03/19/2404274.html 本文所有例子来自于http://blog.cs ...

  7. Backbone学习笔记一Backbone中的MVC

    原文章地址http://bigdots.github.io/2015/12/01/Backbone学习笔记(一)/#more Backbone.js为复杂WEB应用程序提供模型(models).集合( ...

  8. 如何在springMVC 中对REST服务使用mockmvc 做测试

    如何在springMVC 中对REST服务使用mockmvc 做测试 博客分类: java 基础 springMVCmockMVC单元测试  spring 集成测试中对mock 的集成实在是太棒了!但 ...

  9. Backbone中 View之间传值的解决办法

    Backbone中的View就是用来展示由Model层传出的数据,或者在View里产生的一些数据,包括输入框中输入等产生的数据,由当前View传递到另外一个View层里,应该怎么办呢,我之前读到一位博 ...

随机推荐

  1. javascript动画系列第一篇——模拟拖拽

    × 目录 [1]原理介绍 [2]代码实现 [3]代码优化[4]拖拽冲突[5]IE兼容 前面的话 从本文开始,介绍javascript动画系列.javascript本身是具有原生拖放功能的,但是由于兼容 ...

  2. JQuery的基础和应用

    <参考文档>   1.什么是?    DOM的作用:提供了一种动态的操作HTML元素的方法.    jQuery是一个优秀的js库.用来操作HTML元素的工具.    jQuery和DOM ...

  3. arcgis api for js入门开发系列八聚合效果(含源代码)

    上一篇实现了demo的图层控制模块,本篇新增聚合效果,截图如下(源代码见文章底部): 聚合效果实现的思路如下: 1.map.html引用聚合包,项目已经包含进来了的聚合文件夹: <script ...

  4. 使用nginx反向代理,一个80端口下,配置多个微信项目

    我们要接入微信公众号平台开发,需要填写服务器配置,然后依据接口文档才能实现业务逻辑.但是微信公众号接口只支持80接口(80端口).我们因业务需求需要在一个公众号域名下面,发布两个需要微信授权的项目,怎 ...

  5. 我的MYSQL学习心得(十三) 权限管理

    我的MYSQL学习心得(十三) 权限管理 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) ...

  6. 【腾讯Bugly干货分享】程序员们也该知道的事——“期权和股票”

    本文来自于腾讯Bugly公众号(weixinBugly),未经作者同意,请勿转载,原文地址:https://mp.weixin.qq.com/s/pfj9NLLuKYAfJJF84R9WAw 作者:B ...

  7. 在 Ubuntu 14.10 中借用 Windows 的字体

    在前一篇随笔中,我详细讨论了字体的分类及用途,也以 Fedora 20 为例,展示了字体配置的思路和方法.我在配置 Fedora 20 系统字体的时候,采用的是一种釜底抽薪的方法,完全抛开了系统原有的 ...

  8. CSharpGL(37)创建和使用VBO的最佳方式

    CSharpGL(37)创建和使用VBO的最佳方式 开始 近日在OpenGL红宝书上看到这样的讲解. 其核心意思是,在创建VBO时用 glBufferData(GL_ARRAY_BUFFER, len ...

  9. Entity Framework 6 Recipes 2nd Edition(9-3)译->找出Web API中发生了什么变化

    9-3. 找出Web API中发生了什么变化 问题 想通过基于REST的Web API服务对数据库进行插入,删除和修改对象图,而不必为每个实体类编写单独的更新方法. 此外, 用EF6的Code Fri ...

  10. Spark join 源码跟读记录

    PairRDDFunctions类提供了以下两个join接口,只提供一个参数,不指定分区函数时默认使用HashPartitioner;提供numPartitions参数时,其内部的分区函数是HashP ...