什么是执行正确的方式PATCH
同时节省了模型的属性在Backbone.js的要求吗?
Answer 1:
作为Backbone.js的v0.9.9,你可以简单地传递{ patch: true }
以save()
了解更多: http://backbonejs.org/#changelog
Answer 2:
除了詹姆斯Cropchos答案我想补充以下,因为这偷了一些时间从我也许可以帮助别人:
如果你使用model.save(attributesToPatchObject,{patch: true})
喜欢它是可能的,因为骨干v.0.9.9在詹姆斯Cropchos回答说,你可能不知道如何确定哪些属性以来的最后一次通话发生了变化model.save()
向他们传递为attributesToPatchObject
这是从第一个参数model.save()
或model.fetch()
如果你没有保存模型最近)。
骨干本身没有跟踪这些属性的。 我认为方法model.changedAttributes()
可能适合,但作为骨干,医生说这个方法返回
只有模型的属性的哈希值,因为最后一组已更改,或假,如果有没有
所以这种方法并不适合这种需要。 经过一番研究,我发现骨干本身没有跟踪未保存的属性(我知道,不是一个优秀的调查结果,如果我更仔细地阅读文档)。
我发现backbone.trackit是骨干插件,完全需要功能添加到骨干,通过添加方法unsavedAttributes()
的模型。 backbone.trackit的文档说,这个方法:
对称骨干model.changedAttributes(),但它返回模型的属性的哈希已更改自上次保存或假,如果有没有。 像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()
它在需要返回一些其他然后假的 ,只能做你的PATCH请求(因为事情发生了转变)。
注意:您没有调用fetch()
使用startTracking()
所以你可以使用此方法,即使新创建的模型( model.isNew()
返回在这种模式真),如果对于一个用例。
希望这可以救一个人的研究一点点时间。
Answer 3:
你必须重写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;
}
我敢肯定,你可以进一步扩展骨干,包括OPTIONS
和HEAD
如果你需要
不过请注意,甚至通过jQuery的支持PATCH,OPTIONS和HEAD方法,您的最终用户的浏览器可能不。