如何在不触发PATCH而不是POST的情况下,只将一个Backbone Model属性的子集保存到服务器

cmc*_*loh 3 javascript backbone.js

如果我将任何"额外"属性发送回服务器,我正在爆炸的API.现在,我敢肯定,我已经有不存在的服务器端上我的客户端骨干模特属性打破一些规则MVC什么的,但是,我需要做的是发起建立的请求,但只有经过一定的我的模型中的属性我正在启动CREATE请求.

我可以轻松地在骨干中做到这一点:

Model.save({key: val}, {patch: true}); 
Run Code Online (Sandbox Code Playgroud)

然后修改Backbone sync methodMap默认修补程序路由到POST而不是PATCH,这让我知道我正在寻找什么,除了稍后我想在适当的时候实际上能够PATCH(而不是POST).我只需将它作为POST进行POST,就好像它只是用于创建操作的补丁(不适用于更新操作!).

所以,简而言之,我需要采取这样的方式:

new Backbone.Model({'foo': 'bar', 'baz': 'beh'});
Run Code Online (Sandbox Code Playgroud)

并告诉它将自己同步到服务器,但只发送'foo'而不发送'baz',但它必须将其作为POST发送(它不能是PATCH).

有任何想法吗?

Ada*_*der 10

以下是保存覆盖,可以根据需要放置在基本Backbone模型或任何单个模型中.它可能不会涵盖每个用例,但它似乎适合这一个.

JS小提琴:http://jsfiddle.net/hEN88/1/

此覆盖允许您在任何模型上设置"serverAttrs"数组,以过滤将哪些属性发送到服务器.

save: function (attrs, options) { 
    attrs = attrs || this.toJSON();
    options = options || {};

    // If model defines serverAttrs, replace attrs with trimmed version
    if (this.serverAttrs) attrs = _.pick(attrs, this.serverAttrs);

    // Move attrs to options
    options.attrs = attrs;

    // Call super with attrs moved to options
    Backbone.Model.prototype.save.call(this, attrs, options);
}
Run Code Online (Sandbox Code Playgroud)