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