33

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

4

4 回答 4

24

通常 REST 后端处理单个实例的创建/更新。您需要更改它以接受对象数组。

也就是说,在客户端,您需要直接进入 Backbone.sync 函数

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

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

于 2011-02-16T14:45:53.413 回答
12

我将在这里做错事并引用维基百科关于正确的 RESTful 实践:一个PUT应该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

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

于 2012-07-02T22:39:14.260 回答
6

您应该扩展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

于 2012-06-18T14:41:28.740 回答
0

此代码向集合原型添加了一个新方法,只是为了调用已更改模型的保存方法。它对我有用:

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

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

于 2015-07-17T07:26:50.060 回答