仅使用Backbone.js更新某些模型属性

时间:2011-03-15 00:06:42

标签: javascript jquery model-view-controller backbone.js

使用Backbone,我正在尝试更新并向服务器保存一个属性:

currentUser.save({hide_explorer_tutorial: 'true'});

但我不想发送所有其他属性。其中一些实际上是服务器端方法的输出,因此它们实际上并不是具有setter函数的真正属性。

目前我正在使用unset(attribute_name)删除我不想在服务器上更新的所有属性。问题是这些属性不再可供本地使用。

有关如何仅将某些属性保存到服务器的建议?

5 个答案:

答案 0 :(得分:20)

截至Backbone 0.9.9

只需将{patch:true}传递给save函数,就像这样:

currentUser.save({hide_explorer_tutorial: 'true'}, {patch:true});

来自documentation

  

相反,如果您只想将更改后的属性发送到服务器,请调用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));
}