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

pn9klfpd  于 2022-11-10  发布在  其他
关注(0)|答案(5)|浏览(179)

使用Backbone,我尝试只更新一个属性并将其保存到服务器:

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

但我不想发送所有其他属性,其中一些属性实际上是服务器端方法的输出,因此它们实际上不是setter函数的真正属性。
目前我使用unset(attribute_name)来删除所有我不想在服务器上更新的属性。问题是这些属性将不再可用于本地使用。
关于如何只将某些属性保存到服务器的建议?

bihw5rsg

bihw5rsg1#

从 Backbone.js 0.9.9开始

只需将{patch:true}传递给save函数,如下所示:

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

从文档中,
如果您只想将更改后的属性发送到服务器,请致电model.save(attrs,{patch:true})。您将获得一个只包含传入属性的HTTP PATCH请求。

pbpqsu0x

pbpqsu0x2#

您可以在模型上使用toJSON来实现这一点。

toJSON : function(){
  return {hide_explorer_tutorial: this.get("hide_explorer_tutorial")};
}

这将是保存时发送到后端的唯一属性。

34gzjxbg

34gzjxbg3#

事实上,有一种更简单的方法可以实现这一点
如果您查看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的数据部分。
由于 Backbone.js 保存需要model.save([属性],[选项])
但请记住,id等属性可能是正确保存所必需的
范例

model.save( {}, { data: JSON.stringify(data) } ) ;

针对您的特定情况

var data = { id : currentUser.id ,  hide_explorer_tutorial: 'true' }  ;  
currentUser.save( {}, { data : JSON.stringify(data) } );

这对我来说做得很好,可以与任何带有XHR的 Backbone.js 一起使用,如获取,保存,删除,...
感谢您投票

rks48beu

rks48beu5#

这里有一个技巧,如果您在options参数上没有设置data属性,而是设置了attrs属性,那么请求负载将是attrs属性值,而不是所有的模型属性。
注意:这也适用于模型建立动作(POST)。
对于您的特定情况:

var data = { hide_explorer_tutorial: 'true' };  
currentUser.save(data, { attrs : data });

您可以在backbone.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));
}

相关问题