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. 【深入Java虚拟机】之四:类加载机制

    类加载过程     类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括:加载.验证.准备.解析.初始化.使用和卸载七个阶段.它们开始的顺序如下图所示: 其中类加载的过程包括了加载.验 ...

  2. Flexible 弹性盒子模型之CSS flex-grow 属性

    实例 让第二个元素的宽度为其他元素的三倍: div:nth-of-type(1){flex-grow:1;} div:nth-of-type(2){flex-grow:3;} div:nth-of-t ...

  3. Android Studio切换为eclipse的快捷键之后还是有区别的部分快捷键

    Android Studio Eclipse 把代码提示换成了Class Name Completion, 快捷键是Ctrl+Alt+Space(空格键). 代码提示快捷键Alt+/,         ...

  4. Android(安卓)-------CardView

    1.activity_main.xml <android.support.v7.widget.CardView android:id="@+id/cardView" andr ...

  5. java.IO输入输出流:过滤流:buffer流和data流

    java.io使用了适配器模式装饰模式等设计模式来解决字符流的套接和输入输出问题. 字节流只能一次处理一个字节,为了更方便的操作数据,便加入了套接流. 问题引入:缓冲流为什么比普通的文件字节流效率高? ...

  6. Visual Studio Code v0.9.1 发布

    微软的跨平台编辑器 Visual Studio Code v0.9.1 已经发布,官方博客上发布文章Visual Studio Code – October Update (0.9.1):http:/ ...

  7. [PHP源码阅读]strpos、strstr和stripos、stristr函数

    我在github有对PHP源码更详细的注解.感兴趣的可以围观一下,给个star.PHP5.4源码注解.可以通过commit记录查看已添加的注解. strpos mixed strpos ( strin ...

  8. SurfaceView 绘制分形图

    之前一直做的是应用类,这次抽时间,参考网上资料实践了下SurfaceView.目标是在页面上画一个科赫曲线的分形图. 代码如下: package com.example.fredric.demo02; ...

  9. useful commands for docker beginner

    You may want to add my wechat public account or add my technical blog's RSS feed This list is meant ...

  10. ASP.NET MVC Model验证(四)

    ASP.NET MVC Model验证(四) 前言 本篇主要讲解ModelValidatorProvider 和ModelValidator两种类型的自定义实现,前者是Model验证提供程序,而Mod ...