Javascript Backbone.js批量更新集合

Javascript Backbone.js批量更新集合,javascript,backbone.js,web,Javascript,Backbone.js,Web,我有一个对象集合,这些对象将被批量更新(不一定同时更新所有对象,但不止一个) 因此,我需要批量向服务器发送更新(即每个更新的对象不需要一个请求),并且我需要进行部分更新(即仅更新已更改的对象) 我遇到的问题有: 集合上没有save()方法(奇怪的是它有fetch()方法) 自上次与服务器同步以来,集合中已更改的模型没有内置跟踪功能 有没有一种干净、优雅的方式来实现这一点 我已经研究并尝试了一些事情,但所有的解决方案都相当笨拙和过于复杂——这对于一个旨在简化这类事情的框架来说是不可接受的 毫无疑问

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

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

我遇到的问题有:

  • 集合上没有
    save()
    方法(奇怪的是它有
    fetch()
    方法)
  • 自上次与服务器同步以来,集合中已更改的模型没有内置跟踪功能
  • 有没有一种干净、优雅的方式来实现这一点

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


    毫无疑问,有一种体面的方式来做这样一件普通的事情。或者我应该使用另一个框架,例如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();
    
    Backbone.Collection.prototype.save=function()
    {
    var数据=[];
    对于(变量n=0;n

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

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

    Backbone.Collection.prototype.saveChanges=function(){
    var数据=[];
    对于(变量i=0;i
    为什么需要批量更新收藏项目?它们真的可以在应用程序中同时更改吗?如果否,则通常的做法是在更改某个项目后调用model的
    save
    方法。@最后面的是,可以同时更改这些项目。有一个项目列表,其中包含用于选择项目的复选框,用户可以一次对所有选择的项目执行更改(例如,一次更改10个项目的状态-我不希望我的服务器为此收到10个ajax请求),然后您一定要更改应用程序数据的结构。您不应该在包含单个布尔值的模型上构建集合(复选框选中状态)。最好使用包含复选框状态数组的单个模型,而不是在您的案例中使用集合。@最后面的模型不包含布尔复选框状态-这只是UI的一部分。该模型包含有用的数据,用户界面中的复选框供用户选择要操作的模型。谢谢@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)
        });
    };