Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Backbone.js中的补丁请求方法_Backbone.js_Http Patch - Fatal编程技术网

Backbone.js中的补丁请求方法

Backbone.js中的补丁请求方法,backbone.js,http-patch,Backbone.js,Http Patch,在Backbone.js中保存模型属性时,执行补丁请求的正确方法是什么?您必须覆盖Backbone.sync并扩展现有的方法映射器 var methodMap = { 'create': 'POST', 'update': 'PUT', 'delete': 'DELETE', 'read': 'GET', 'patch': 'PATCH' }; 您必须在模型上创建自己的补丁方法,如 Backbone.Model.prototype.patch =

在Backbone.js中保存模型属性时,执行
补丁
请求的正确方法是什么?

您必须覆盖
Backbone.sync
并扩展现有的方法映射器

var methodMap = {
    'create': 'POST',
    'update': 'PUT',
    'delete': 'DELETE',
    'read':   'GET',
    'patch':  'PATCH'
};
您必须在模型上创建自己的补丁方法,如

Backbone.Model.prototype.patch = function(options) 
{
    // some code here that checks what attributes have changed since last save
    var xhr = (this.sync || Backbone.sync).call(this, 'patch', this, options);
    return xhr;  
}
我相信,如果需要,您可以进一步扩展主干以包括
选项
头部


但是请注意,即使jQuery支持补丁、选项和HEAD方法,最终用户的浏览器也可能不支持。

从Backbone.js v0.9.9开始,您只需将
{PATCH:true}
传递到
save()

阅读更多内容:

除此之外,我还想添加以下内容,因为这些内容来自我,可能会帮助其他人:

如果您使用
model.save(attributesToPatchObject,{patch:true})
就像James Cropchos回答中所述的主干网版本5.0.9.9一样,您可能想知道如何确定自上次调用
model.save()以来哪些属性发生了更改
将它们作为
attributesToPatchObject
传递,这是
model.save()
(或者
model.fetch()
中的第一个参数,如果您最近没有保存模型)

主干网本身没有跟踪这些属性。我认为方法
model.changedAttributes()
可能合适,但随着此方法返回

仅对自上次更改以来已更改的模型属性进行哈希 设置,如果没有,则为false

所以这种方法不适合这种需要。经过一些研究,我发现主干网本身并没有跟踪未保存的属性(我知道,如果我仔细阅读文档的话,这不是一个很好的发现)

我发现这是一个主干插件,通过向模型中添加方法
unsavedAttributes()
,它准确地向主干添加了所需的功能。backbone.trackit的文档介绍了这种方法:

与主干的model.changedAttributes()对称,但这会返回自上次保存以来已更改的模型属性的哈希值,如果没有,则返回false。与changedAttributes一样,可以传入外部属性哈希,返回该哈希中与模型不同的属性

它的工作原理如下:

//fetch an existing model from server
model.fetch({
  success : function(model, respose, options) {
    //tell backbone.trackit to track unsaved Attributes
    model.startTracking();
  }
});

//now some changes to the model happen
model.set("someProperty", "someValue");

/* save the model to server using the PATCH-Method 
   and only send the unsaved Attributes; 
   in this case only "someProperty" is sent
*/
model.save(model.unsavedAttributes(), {patch: true});
由于如果没有未保存的属性,
unsavedAttributes()
将返回false,因此您还可以将
save()
语句包装在if条件中,该条件检查
unsavedAttributes()
是否返回false以外的值,并且仅在需要时执行修补程序请求(因为发生了更改)

注意:您不必调用
fetch()
来使用
startTracking()
,因此即使在新创建的模型中也可以使用此方法(
model.isNew()
在该模型上返回true),如果有这样的用例的话


希望这可以节省一些研究时间。

哇,堆栈溢出不允许在标题中发布所有大写单词的问题。Smart.
myModel.save(data,{patch:true})
在Chrome的网络面板中显示为使用“选项”的HTTP方法,这似乎不正确。该选项首先作为飞行前发送。若通过,那个么补丁将被发送。但我得到了400个错误的请求错误,put-however可以正常工作@simpgy