Backbone.js中的PATCH请求方法

时间:2012-05-17 13:56:16

标签: backbone.js http-patch

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

3 个答案:

答案 0 :(得分:35)

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

了解详情:http://backbonejs.org/#changelog

答案 1 :(得分:9)

James Cropchos answer之外,我想添加以下内容,因为this steals some hours来自我并可能帮助其他人:

如果您使用model.save(attributesToPatchObject,{patch: true}),因为James Cropchos中所述的骨干v.0.9.9可以回答,您可能想知道如何确定自上次调用model.save()以来哪些属性发生了变化将它们作为attributesToPatchObject的{​​{1}}传递,这是model.save()的第一个参数(如果您最近没有保存模型,则为model.fetch()。)

Backbone本身并没有跟踪这些属性。我认为方法model.changedAttributes()可以适合,但正如backbone-doc says此方法返回

  

仅包含自上次更改后的模型属性的哈希值   设置,如果没有,则为false

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

我发现backbone.trackit是一个骨干插件,通过将方法unsavedAttributes()添加到模型中,可以为骨干添加所需的功能。 backbone.trackit的文档说明了这种方法:

  

与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});

由于unsavedAttributes()如果没有未保存的属性,则返回 false ,您可以另外将save()语句包装在if条件中,以检查是否unsavedAttributes()返回 false 以外的其他内容,只有在需要时才会执行PATCH-Request(因为更改了内容)。

注意:您没有必要致电fetch()来使用startTracking(),因此您可以使用此方法,即使是新创建的模型(model.isNew()在该模型上返回true),如果有一个用例。

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

答案 2 :(得分:8)

您必须覆盖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;  
}

如果您需要,我确信您可以进一步扩展Backbone以包含OPTIONSHEAD

但请注意,即使通过jQuery支持PATCH,OPTIONS和HEAD方法,您的最终用户浏览器也可能不支持。