【问题标题】:Backbone.js updating a collection in bulkBackbone.js 批量更新集合
【发布时间】:2015-03-31 08:17:48
【问题描述】:

我有一组将被批量更新的对象(不一定全部同时更新,但不止一个)。

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

我遇到的问题:

  1. Collection 上没有 save() 方法(奇怪的是它有 fetch() 方法)
  2. 没有内置跟踪自上次与服务器同步后集合中已更改的模型。

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

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

在 Backbone 中肯定有一个不错的方法来做这样一件常见的事情。或者我应该使用另一个框架,例如Angular JS?

【问题讨论】:

  • 为什么需要批量更新收藏品?它们真的可以在您的应用中同时更改吗?如果不是,那么通常的做法是在某些项目发生更改时调用模型的save 方法。
  • @hindmost 是的,它们可以同时更改。有一个带有复选框的项目列表来选择项目,用户可以一次对所有选定的项目执行更改(例如,一次更改 10 个项目的状态 - 我不希望我的服务器收到 10 个 ajax 请求) )
  • 那你肯定要改变你的应用数据的结构。您不应该在包含单个布尔值(复选框选中状态)的模型上构建集合。在您的情况下,最好使用包含复选框状态数组的单个模型,而不是使用集合。
  • @hindmost 模型不包含布尔复选框状态 - 这只是 UI 的一部分。模型包含有用的数据,用户界面中的复选框供用户选择他们希望操作的模型。

标签: javascript backbone.js web


【解决方案1】:

您可以只构建模型的 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。这看起来不错。我会试一试,看看效果如何。
【解决方案2】:

只是为了帮助任何发现这个问题的人,这就是我最终使用的(基于@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)
    });
};

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-10
    相关资源
    最近更新 更多