保存Backbone.js模型并更新整个Collection

时间:2012-04-03 18:24:09

标签: backbone.js

我希望能够在骨干模型上调用save()并让后端返回此模型的整个集合,而不是仅返回模型的已更改属性。然后我想骨干更新整个返回的集合。用例如下:

用户有多个地址,可以从此集合中选择送货地址。如果她从集合中选择不同的送货地址,则先前的送货地址应更新为“只是另一个普通地址”的状态。为此,必须更新整个集合,而不仅仅是更改的模型。

在backbone.js中这有可能吗?

提前多多感谢!

4 个答案:

答案 0 :(得分:4)

绑定到集合的模型,将其集合父级包含为属性。此外,由于您返回了一个模型列表,我们可以假设它总是在列表中。

mymodel = Backbone.Model.extend({
   parse: function (data) {
     if(this.collection && typeof(data) === 'array') {
        this.collection.reset(data);
     }
     return data;
   }
});

答案 1 :(得分:2)

我不认为在这里必须超越同步或打破保存退货的期望。

我想在模型上覆盖save会更简单,其中包括以下内容:

save: function (key, value, options) {
    var p = Model.prototype.save.call(this, key, value, options),
        self=this;
    if (this.collection) {
        p.done(function () { self.collection.fetch(); });
    }
    return p;
}

将使用正常save获取其承诺进行保存,然后如果保存成功且模型是集合的一部分,它将从服务器获取集合。

另一种方法是绑定到模型的change事件,检查它是否属于集合和提取,但这也会发生在set上。

答案 2 :(得分:1)

是的,这是可能的。您需要覆盖模型上的sync函数

MyModel = Backbone.Model.extend({
  sync: function(method, model) {
    if (method === 'create') {
      //perform save logic and update the model's collection
    } else if (method === 'update') {
      //perform save logic and update the model's collection
    } else if (method === 'read') {
      ...
    } else if (method === 'destroy') {
      ...
    }
  }
});

有关详细信息,请查看Backbone.sync函数。

答案 3 :(得分:0)

您的用例实际需要的是更新两个模型,而不是更新整个集合。 (除了提取之外,集合不与Backbone中的服务器交互。)假设您有地址A,B和C,其中A作为当前发货地址,C作为新的发货地址,您的代码可以简单地:

  1. 将C更新为新的送货地址。
  2. 将A更新为“只是另一个地址。”
  3. 如果您的问题是知道哪个地址是当前地址(即地址A),那么您可以在您的收藏中搜索它(即“给我当前送货地址“),更新C,然后更新返回的地址(地址A)。

    如果绝对需要更新整个集合(您没有),请循环浏览collection.models并单独更新每个集合。在一个集合的Backbone中,没有任何概念可以作用于RESTful。

    编辑:我可能误解了您的问题。如果您的意思是更新客户端上的集合(即,您不打算更新服务器上的集合),那么代码仍然类似,您只需更新旧模型和新模型。