保存整个集合的最佳实践?

假设我有一个集合,并且我对许多模型进行了修改。 使用单个HTTP请求保存所有更改的最佳方式是什么?


通常REST后端处理单个实例的创建/更新。 您需要将其更改为接受一组对象。

也就是说,在客户端,你需要直接进入Backbone.sync功能

Backbone.sync = function(method, model, options)

在这种情况下,你的模型应该是一个模型数组。 该方法应该是“创建”或“保存”,并且这些选项与jQuery ajax调用(错误,成功等)具有相同类型的选项。


我会在这里做错误的事情,并引用维基百科关于正确的REST风格的做法:对example.com/resourcesPUT应该用另一个集合取代整个集合。 基于此,当我们不得不支持同时编辑多个项目时,我们编写了这份合同。

  • 客户端发送{"resources": [{resource1},{resource2}]}
  • 服务器用来自客户端的新信息替换整个集合,并在持久保留后返回信息: {"resources": [{"id":1,...},{"id":2,...}]}
  • 我们在Rails中将服务器的一半写入了合约,但这里是客户端的一半(在CoffeeScript中,对不起!):

    class ChildElementCollection extends Backbone.Collection
      initialize: ->
        @bind 'add', (model) -> model.set('parent_id', @parent.id)
    
      url: -> "#{@parent.url()}/resources" # let's say that @parent.url() == '/parent/1'
      save: ->
        response = Backbone.sync('update', @, url: @url(), contentType: 'application/json', data: JSON.stringify(children: @toJSON()))
        response.done (models) => @reset models.resources
    

    我认为这是一个更容易实现,然后重写Backbone.sync。 对代码的一个评论,我们的集合始终是子对象,这应该解释为什么代码将对象添加到集合时设置“parent_id”,以及URL的根是如何作为父对象的URL。 如果您有要修改的根级集合,那么只需删除@parent业务。


    你应该扩展Backbone.Collection ,给它一个save()方法来检查它的每个模型hasChanged()

    然后它应该调用Backbone.sync ,你可能不得不扩展到一个自定义的同步功能。 如果您使用自定义的Backbone.sync功能,那么一定要将其设置在您的收藏夹中。

    var CollectionSync = function(method, model, [options]) {
        // do similar things to Backbone.sync
    }
    
    var MyCollection = Backbone.Collection.extend({
        sync: CollectionSync,
        model: MyModel,
        getChanged: function() {
            // return a list of models that have changed by checking hasChanged()
        },
        save: function(attributes, options) {
            // do similar things as Model.save
        }
    });
    

    使用不同的方法(使用模型来表示集合)在这里:“如何”在Backbone.js中保存整个集合 - Backbone.sync或jQuery.ajax?

    我也喜欢https://stackoverflow.com/a/7986982/137067

    链接地址: http://www.djcxy.com/p/67127.html

    上一篇: Best practice for saving an entire collection?

    下一篇: "How" to save an entire collection in Backbone.js