如何更新数据库中的整个Backbone.js集合?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何更新数据库中的整个Backbone.js集合?相关的知识,希望对你有一定的参考价值。

我在数据库中有一个集合(一个对象列表)。我可以像:collectionModel.fetch()一样获取它然后用户更改该集合上的内容。当用户单击“保存”按钮时,必须在数据库中更新整个集合列表。我想也许我可以先用旧的delete(),然后用新的create()它,但我不能实现它。我不能使用update()方法,因为在这种情况下,我应该找到哪些集合元素已更改但我想更新整个列表。我怎样才能做到这一点?感谢帮助。

答案

你在那个数据库前面有一个REST api吗?这就是Backbone的使用方式。当您的javascript代码运行model.save();时,会向您的api发出针对该模型的PUT请求。

您的问题是关于保存整个集合,因为如果您想要保留在Backbone的默认实现中,您将必须遍历集合中的所有模型并为每个模型调用save。

如果要向服务器发出单个请求,则必须在集合中实现自定义方法。就像是:

MyCollection = Backbone.Collection.extend({
    saveAll: function() {
        var data = this.toJSON();
        return Backbone.$.ajax({
            data: { objects: data },
            url: '/url/in/your/server/to/update/db'
        });
    }
});

这将把您集合中所有模型的数组转换为JSON发送到您的服务器。

同样,如果您希望使Backbone更轻松,那么您希望在服务器端拥有RESTful API。

另一答案

如果要重置集合,则必须指定“重置”属性。

collectionList.fetch({
    reset: true,

   ...
});

但我认为最好只更新它:

collectionList.fetch({
    remove: false,
    update: true,
    merge: true,

   ...
});
另一答案

这是一个非常古老的问题,但我有另一种方法,所以我想我会发布它。

有时我的馆藏有很多数据,而服务器却无法完成所有数据。我通过使用骨干集合中的一个下划线方法解决了这个问题,invoke(也依赖于jquery):

MyCollection = Backbone.Collection.extend({
  update: function(callback) {
    // Invoke the update method on all models
    $.when.apply($, this.invoke('update')).then(() => {
      // After complete call the callback method (if passsed)
      if(callback) {
        callback();
      }
    });
  }
});

当集合中包含模型时,您可以通过调用collection.update()来使用它。类似的方法可以用于创建或删除集合,这应该是可修改的以捕获错误,但我没有考虑到这一点。

以上是关于如何更新数据库中的整个Backbone.js集合?的主要内容,如果未能解决你的问题,请参考以下文章

Backbone.js 中的命名空间

将集合绑定到 Backbone.js 中的视图

Backbone.js — 匿名视图实例中的集合在获取时多次请求

渲染 Backbone.js 集合

Backbone.js:在现实世界的应用程序中呈现集合

Backbone.js 将模型添加到集合问题