除了James Cropchos的回答,我想添加以下内容,因为这会偷走我几个小时,也许可以帮助其他人:
如果您使用model.save(attributesToPatchObject,{patch: true})
,因为可能因为James Cropchos中所述的主干v.0.9.9回答,您可能想知道如何确定自上次调用以来哪些属性已更改model.save()
,因为attributesToPatchObject
它是第一个参数model.save()
(或者model.fetch()
如果你最近没有保存模型).
Backbone本身并没有跟踪这些属性.我认为该方法model.changedAttributes()
可以适合,但正如骨干文档说这个方法返回
仅包含自上次设置以来已更改的模型属性的哈希值,如果没有则返回false
所以这种方法不适合这种需要.经过一些研究后,我发现骨干本身没有跟踪未保存的属性(我知道,如果我更仔细地阅读文档,那不是一个很好的发现).
我发现backbone.trackit是一个骨干插件,通过将方法添加unsavedAttributes()
到模型中,可以为骨干添加所需的功能.backbone.trackit的文档说明了这个方法:
Symmetric to Backbone的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});
Run Code Online (Sandbox Code Playgroud)
如果没有未保存的属性,则unsavedAttributes()
返回false,您可以另外将save()
语句包装在if条件中,该条件检查是否unsavedAttributes()
返回除false之外的其他内容,并且仅在需要时执行PATCH-Request(因为更改了某些内容).
注意:您没有必须调用fetch()
使用,startTracking()
因此即使对于新创建的模型也可以使用此方法(model.isNew()
如果有该用例,则在该模型上返回true).
希望这可以节省一些研究时间.
您必须覆盖Backbone.sync
并扩展现有的方法映射器
var methodMap = {
'create': 'POST',
'update': 'PUT',
'delete': 'DELETE',
'read': 'GET',
'patch': 'PATCH'
};
Run Code Online (Sandbox Code Playgroud)
你必须在类似的模型上创建自己的补丁方法
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;
}
Run Code Online (Sandbox Code Playgroud)
我相信你可以进一步扩展Backbone OPTIONS
,HEAD
如果你需要的话
请注意,即使通过jQuery支持PATCH,OPTIONS和HEAD方法,您的最终用户的浏览器也可能不支持.