使用Backbone,我正在尝试更新并向服务器保存一个属性:
currentUser.save({hide_explorer_tutorial: 'true'});
但我不想发送所有其他属性。其中一些实际上是服务器端方法的输出,因此它们实际上并不是具有setter函数的真正属性。
目前我正在使用unset(attribute_name)删除我不想在服务器上更新的所有属性。问题是这些属性不再可供本地使用。
有关如何仅将某些属性保存到服务器的建议?
答案 0 :(得分:20)
截至Backbone 0.9.9
只需将{patch:true}
传递给save
函数,就像这样:
currentUser.save({hide_explorer_tutorial: 'true'}, {patch:true});
相反,如果您只想将更改后的属性发送到服务器,请调用model.save(attrs,{patch:true})。只有传入的属性,您将收到服务器的HTTP PATCH请求。
答案 1 :(得分:7)
您可以在模型上使用toJSON来执行此操作。
toJSON : function(){
return {hide_explorer_tutorial: this.get("hide_explorer_tutorial")};
}
这将是保存时发送到后端的唯一属性。
答案 2 :(得分:4)
实际上有一种更简单的方法来实现这个
如果你看看backbone.js第1145行,你会看到
// Ensure that we have the appropriate request data.
if (options.data == null && model && (method === 'create' || method === 'update' || method === 'patch')) {
params.contentType = 'application/json';
params.data = JSON.stringify(options.attrs || model.toJSON(options));
}
这意味着您可以通过在选项中添加数据来覆盖xhr的数据部分
由于骨干保存需要model.save([attributes],[options])
但请记住,像id这样的属性可能对正确保存至关重要
示例
model.save( {}, { data: JSON.stringify(data) } ) ;
针对您的具体情况
var data = { id : currentUser.id , hide_explorer_tutorial: 'true' } ;
currentUser.save( {}, { data : JSON.stringify(data) } );
这对我来说非常好用,可以和xhr的任何骨干一起使用,例如fetch,save,delete,...
感谢投票
答案 3 :(得分:1)
我想现在不可能:Backbone.js partial model update
答案 4 :(得分:0)
有个窍门,如果您没有在data
参数上设置attrs
属性,而是设置options
属性,则请求有效载荷将是attrs
属性值,而不是所有模型属性。
注意:这也适用于模型创建操作(POST)。
针对您的特定情况:
var data = { hide_explorer_tutorial: 'true' };
currentUser.save(data, { attrs : data });
您可以从以下网站找到更多详细信息:steel.js 1.33 source code(第1405-1409行):
// Ensure that we have the appropriate request data.
if (options.data == null && model && (method === 'create' || method === 'update' || method === 'patch'))
{
params.contentType = 'application/json';
params.data = JSON.stringify(options.attrs || model.toJSON(options));
}