3

如果我将任何“额外”属性发送回服务器,我遇到的 API 就会爆炸。现在,我确定我已经打破了一些 MVC 规则或通过在我的客户端 Backbone 模型上拥有服务器端不存在的属性,但是,我需要做的是发起一个 CREATE 请求,但只通过一些我从我的模型中发起 CREATE 请求的属性。

我可以很容易地在主干中做到这一点:

Model.save({key: val}, {patch: true}); 

然后修改主干同步方法映射默认补丁路由为 POST 而不是 PATCH,这让我得到了我正在寻找的东西,除了稍后我希望在适当的时候真正能够 PATCH(而不是 POST)。我需要它来发布,就好像它只是为创建操作进行修补(而不是更新操作!)。

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

new Backbone.Model({'foo': 'bar', 'baz': 'beh'});

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

有任何想法吗?

4

3 回答 3

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);
}
于 2013-04-10T00:50:05.087 回答
1

这个问题听起来可能是同步时排除模型属性(Backbone.js)和模型.save()的Backbone.js/express.js参数的欺骗

这两种情况的答案都归结为覆盖该save()函数。

于 2013-04-09T21:01:01.533 回答
0

您可以覆盖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);
}
于 2014-07-08T09:25:38.927 回答