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

有帮助吗?

解决方案

通常休息后端处理单实例创建/更新。您需要更改它以接受一系列对象。 如上所述,在客户端,您需要直接转到Backbone.sync函数

Backbone.sync = function(method, model, options)
. 在这种情况下,您的模型应该是一系列模型。该方法应该是“创建”或“保存”,并且选项将与jQuery Ajax调用(错误,成功等)相同类型的选项。

其他提示

我要在这里做错误的事情,并引用维基百科关于 适当的RESTful做法:a example.com/resources 应用另一个集合替换整个集合。基于此,当我们必须支持同时编辑多个项目时,我们写了这个合同。

  1. 客户端发送 {"resources": [{resource1},{resource2}]}
  2. 服务器使用来自客户端的新信息替换整个集合,并在持久化信息后返回这些信息: {"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

我以为这是一个 地段 更容易实现,然后复盖骨干。同步。在代码上的一个注释中,我们的集合总是子对象,这应该解释为什么当一个对象被添加到集合中时,代码设置一个"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-骨干网。同步或jQuery。阿贾克斯?

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

此代码将新方法添加到集合原型中只是为了调用已更改的那些模型的保存方法。它为我工作:

Backbone.Collection.prototype.saveAll = function(options) {
 return $.when.apply($, _.map(this.models, function(m) {
   return m.hasChanged() ? m.save(null, options).then(_.identity) : m;
 }));
};
.

gist链接: https://gist.github.com/julianitor/701c677279bac1529b88

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top