Javascript 更新模型,但保留整个主干集合

Javascript 更新模型,但保留整个主干集合,javascript,backbone.js,backbone.js-collections,backbone-model,Javascript,Backbone.js,Backbone.js Collections,Backbone Model,我的API回应: { firstName: '', lastName: '', notifications: [ { category: '1', subcategory: '', source: '', optInDate: '', optOutDate: '', active: '' }, { category: '2', subcategory: '',

我的API回应:

{
  firstName: '',
  lastName: '',
  notifications: [
    {
      category: '1',
      subcategory: '',
      source: '',
      optInDate: '',
      optOutDate: '',
      active: ''
    },
    {
      category: '2',
      subcategory: '',
      source: '',
      optInDate: '',
      optOutDate: '',
      active: ''
    }
  ]
}
我对响应的相应主干实现是:

var Notification = Backbone.Model.extend({
  initialize: function (args) {  },
});

var Notifications = Backbone.Collection.extend({
  model: Notification,
  url: '/xyz/abc',

  parse: function (data) {
    return data.notifications;
  },
});
我只想用say
active:true更新“category 1”模型(这始终是真的),但要在我的请求负载中保留整个集合,而不仅仅是更改的模型。我们如何用骨干力量实现这一目标

我已经尝试获取该特定模型并执行
model.set({active:true})
并调用
model.save()
,但这只会将该模型发送到服务器

我需要将整个响应与更新的模型一起持久化回服务器

编辑:

我在他下面的回答中做到了这一点。但是,我忘了提到,我还需要将其他属性与集合一起发送,即上述响应中的
firstName
lastName

我正在重写
parse
方法,以包括它们,如下所示:

parse: function(data) { 
  this.firstName = data.firstName; 
  this.lastName = data.lastName; 
  return data.notifications; 
} 

当我调用
Backbone.sync
时,它仍然只发送有效负载中的集合。这是因为我只返回解析方法中数据对象的通知吗?

我不确定您想做什么,我觉得这不对。如果只有一个型号发生更改,为什么需要将整个集合发送到服务器?服务器上是否已经安装了未更改的型号?我认为你应该重新考虑这个方法

无论如何,如果你真的需要它,这将实现你想要的:

Backbone.sync("update", Notifications);
更多文档

更新

如果每次收集
sync
时都有许多额外数据要发送,则可以重写
sync
方法以对收集进行自定义同步行为。否则,您可以在需要时使用
options.attrs
自定义数据:

Backbone.sync("update", Notifications, {
    attrs: {
        data: Notifications.toJSON(),
        firstName: 'foo',
        lastName: 'bar',
    }
});
为了理解为什么这样做,我建议您阅读主干源代码,我想说的是不要像使用
sync
那样和覆盖
主干。sync
功能应该非常小心,因为它是每个模型和集合共享的

虽然它现在适用于您的用例,但从长远来看,它更像是一个补丁



API期望整个DTO在有效负载中发送回来,以维护RESTFul

如果API是真正的RESTful,它将提供一个端点来单独管理通知

作为未来读者的参考,创建一个端点来单独管理模型。这是创建RESTAPI的方法。我仔细考虑了这项技术的优缺点,并在文章中提到了主干

API不允许更改其实现

因为您不能,这意味着API响应代表的是一个模型,而不是一个集合。主干网提供了基于RESTful API的预定义行为,其中一个对象应该是一个模型,一个对象数组应该是一个集合(当接收带有集合(如页面计数等)的元数据时除外)主干集合没有
保存
功能,因此不应一次保存所有集合

在您的情况下,用户模型可能会完成这项工作

注意,有很多。这里有一个简单的例子

您可以像使用任何其他模型一样使用该模型

var user = new UserModel({ id: 'user-id-1' });
user.fetch();
当你需要这些通知时,它们已经在一个方便的集合中提供了

var notif = user.notifications.findWhere({ category: '1' });
if (notif) {
    notif.set({ active: true });
    user.saveNotifications();
}
用户模型上的
sync
和通知集合上的
reset
等主干事件将正确触发

在处理大量数据时,这种技术有一些缺点,一次保存所有数据集应该会让人大开眼界延迟加载分页是在这种情况下提高性能的方法,显然,下面的方法会有很大帮助


在我们公司,我们的API深受这本书的启发,我很高兴我们正在使用这本书。

API希望整个DTO在有效负载中发送回来,以保持RESTFul,因此整个集合需要在有效负载中发送回来。API不允许更改其实现,因此需要在前端完成。Backbone.sync有什么帮助?是否应在model.set之后调用同步?和model.save()?您不需要调用
save
,只需通过
set
更新模型,并在希望持久保存到有效的数据库时调用
sync
。很抱歉,我忘了提到我还需要将其他属性与集合一起发送,即上面响应中的firstName和lastName。我重写了parse方法,将它们包括在下面-parse:function(data){this.firstName=data.firstName;this.lastName=data.lastName;return data.notifications;}当我调用Backbone.sync时,它仍然只发送有效负载中的集合。这是因为我只返回解析方法中数据对象的通知吗?我怎样才能做到这一点?谢谢你的帮助
parse
用于处理从服务器发送的数据,您不能在此处使用它。检查我的最新答案
var notif = user.notifications.findWhere({ category: '1' });
if (notif) {
    notif.set({ active: true });
    user.saveNotifications();
}