Backbone.js批量更新集合

Backbone.js updating a collection in bulk

本文关键字:更新 集合 js Backbone      更新时间:2023-09-26

我有一个对象集合,这些对象将被批量更新(不一定同时更新所有,而是不止一个)。

因此,我需要批量向服务器发送更新(即不是每个更新对象都有一个请求),并且我需要进行部分更新(即只更新已更改的对象)。

我遇到的问题:

  1. Collection上没有save()方法(考虑到它有fetch()方法,这很奇怪)
  2. 没有对集合中自上次与服务器同步以来发生更改的模型进行内置跟踪

有没有一种干净、优雅的方式来实现这一点?

我研究并尝试了一些事情,但所有的解决方案都相当笨拙和过于复杂——这对于一个旨在简化这类事情的框架来说是不可接受的。

当然,在Backbone中有一种体面的方法可以做这样一件常见的事情。或者我应该使用另一个框架,例如Angular JS?

您只需构建一个模型的JSON表示数组。像这样的东西。

Backbone.Collection.prototype.save = function()
{
    var data = [];
    for (var n = 0; n < this.length; ++n)
    {
        data.push(this.models[n].toJSON());
    }
    // save data through jQuery
    console.log(data);
};
var col = new Backbone.Collection();
col.add({status: true});
col.add({status: false});
col.save();

您可以添加一些model.hasChanged()检查,以防止不必要的节省。

为了帮助任何发现这个问题的人,我最终使用了以下内容(基于@joconja的回答):

Backbone.Collection.prototype.saveChanges = function() {
    var data = [];
    for (var i = 0; i < this.length; ++i) {
        if (this.models[i].hasChanged()) {
            var changes = this.models[i].changedAttributes();
            changes.id = this.models[i].get('id');
            data.push(changes);
            this.models[i].changed = {};
        }
    }
    Backbone.ajax({
        url: this.url,
        method: 'PUT',
        contentType: 'application/json',
        data: JSON.stringify(data)
    });
};