Backbone中的model和collection在做save或者create操作时, 如何选择用POST还是PUT方法 ?
2016-09-24 15:57
399 查看
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请求。
2. 如下的Model类User,uid被定义为键值属性,创建实例时, uid为空,那么也是新实例对象,在save或者create时,就用POST请求。
3. 如下的Model类User,uid被定义为键值属性,创建实例时, uid不为空,在save或者create时,就用PUT请求。
4. Backbone中,键属性除了用显示的idAttribute定义以外,还有一个隐式的约定,即如果model的属性里面有个"id", 那么这个"id"属性就是键属性。所以以下定义的User虽然没有显示定义键属性,但却是有键值的,所以同步后台时会发送PUT请求
5. 以上任何一种约定,backbone内部的判断逻辑其实都在isNew()方法中, isNew()是Model内部的一个方法, 返回值为true,表示为新实例,save/create触发POST请求; 返回值为false, save/create触发PUT请求。如下,虽然设有隐式的id键属性,单由于重载后的isNew()方法始终返回true, 所以依然触发POST请求
另外需要注意的是,发送PUT时, URL请求后面会自动加上键值,变成“/users/a”,由于没有键值,所以POST实际发送的url和定义时一样
所以,问题的关键是,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和定义时一样
相关文章推荐
- C#中,如何选择使用虚方法还是抽象方法
- backbone Model调用save方法的时候提交方式
- Model First、Database First、Code First – 如何选择合适的Entity Framework开发方法
- 在xml布局文件中,我们既可以设置px,也可以设置dp(或者dip)。一般情况下,我们都会选择使用dp,这样可以保证不同屏幕分辨率的机器上布局一致。但是在代码中,如何处理呢?很多控件的方法中都只提供了
- [Backbone.js]如何处理Model里面嵌入的Collection?
- 抓包工具Fiddler的使用教程(十一):如何知道HTTP请求是POST方法还是GET方法
- springMVC正确使用GET POST PUT和DELETE方法,如何传递参数
- gridview 自定义按钮 如何取得当前行的得数据,或者关键字段的方法
- 了解如何选择无线加密的方法
- VB还是C#,如何选择?
- 是使用 ASP.NET Web 服务还是使用 .NET Remoting:如何选择
- 如何解决FormView中实现DropDownList连动选择时出现 "Eval()、XPath() 和 Bind() 这类数据绑定方法只能在数据绑定控件的上下文中使用" 的错误
- 如何选择安全远程管理方法
- Visual Basic.net还是C# ——如何选择.net语言
- [转载]ASP.NET Web 服务还是 .NET Remoting:如何选择,使用 Microsoft .NET 建立分布式应用程序
- 用VMWare Server还是Workstation,叫我如何选择?
- 如何选择结构还是类
- ASP中如何判断一个FORM是POST还是GET??
- ASP.NET Web 服务还是 .NET Remoting:如何选择
- 如何判断一个网页是刷新还是关闭的方法。