保存整个系列的最佳做法?

a p*_*erd 33 model-view-controller jquery backbone.js backbone.js-collections

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

Jul*_*ien 24

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

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

Backbone.sync = function(method, model, options)
Run Code Online (Sandbox Code Playgroud)

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


car*_*iam 12

我要在这里做了错误的事情,并引述维基百科关于正确RESTful的做法:一个PUTexample.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
Run Code Online (Sandbox Code Playgroud)

我认为这是一个很多更容易实现,然后覆盖Backbone.sync.关于代码的一个注释,我们的集合总是子对象,这可以解释为什么每当对象被添加到集合时代码设置"parent_id",以及URL的根是父对象的URL.如果您要修改根级别集合,则只需删除该@parent业务.


phi*_*reo 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
    }
});
Run Code Online (Sandbox Code Playgroud)

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

我也喜欢/sf/answers/559088771/