Javascript 如何仅保存主干模型的子集';在不触发修补程序而不是POST的情况下,将属性添加到服务器

Javascript 如何仅保存主干模型的子集';在不触发修补程序而不是POST的情况下,将属性添加到服务器,javascript,backbone.js,Javascript,Backbone.js,如果我将任何“额外”属性发送回服务器,我遇到的API就会爆炸。现在,我确信我已经打破了一些MVC规则或其他东西,因为我的客户端主干模型上的属性在服务器端不存在,但是,我需要做的是启动一个创建请求,但只传递我启动创建请求的模型中的一些属性 我可以很容易地在主干中完成这项工作: Model.save({key: val}, {patch: true}); 然后修改主干同步methodMap默认的补丁路由为POST而不是patch,这正好是我要寻找的,只是以后我希望在适当的时候能够实际进行补丁(而

如果我将任何“额外”属性发送回服务器,我遇到的API就会爆炸。现在,我确信我已经打破了一些MVC规则或其他东西,因为我的客户端主干模型上的属性在服务器端不存在,但是,我需要做的是启动一个创建请求,但只传递我启动创建请求的模型中的一些属性

我可以很容易地在主干中完成这项工作:

Model.save({key: val}, {patch: true}); 
然后修改主干同步methodMap默认的补丁路由为POST而不是patch,这正好是我要寻找的,只是以后我希望在适当的时候能够实际进行补丁(而不是POST)。我只需要把它贴出来,就好像它只是为创建操作(而不是更新操作)打补丁一样

因此,简而言之,我需要这样做:

new Backbone.Model({'foo': 'bar', 'baz': 'beh'});
并告诉它将自身同步到服务器,但只发送“foo”而不发送“baz”,但它必须将其作为帖子发送(它不能是补丁)


有什么想法吗?

这个问题听起来像是一个和的骗局


在这两种情况下,答案都归结为覆盖
save()
函数。

下面是一个存储覆盖,可以根据需要放置在基本主干模型或任何单个模型中。它可能不涵盖所有用例,但似乎适合这个用例

JS小提琴:

此覆盖允许您在任何模型上设置“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);
}

您可以重写
toJSON
方法

// set viewOnlyAttrs for attributes no need to save
viewOnlyAttrs: ['url'],

toJSON: function(options) {
  var obj = this;

  // if is calling from model's save method
  if(_.has(options || {}, 'emulateHTTP') && obj.viewOnlyAttrs)
    return _.omit(obj.attributes, obj.viewOnlyAttrs);

  return Backbone.Model.prototype.toJSON.call(this, options);
}

一个小编辑。不要将空对象传递给save.call(),而是将属性放在那里,这将适用于create和patch。所以:
Backbone.Model.prototype.save.call(this、attrs、options)很好的发现!更新的answer and JS Fiddle link.fyi:如果在coffeescript中通过扩展ROR资产管道执行此操作,并且您的类名按字母顺序排列在您要扩展的任何类名之前,则需要通过
##=require./base
明确要求它。这太棒了。我认为最好是定义excludeAttrs而不是serverAttrs,因为在大多数情况下,定义不需要发送的变量比定义所有需要发送的变量要短。您只需使用u.omit(attr,this.excludeAttrs)。