【问题标题】:temporary backbone collection for editing models用于编辑模型的临时主干集合
【发布时间】:2013-04-20 11:46:05
【问题描述】:

我正在处理一个集合和模型:

var StuffCollection = Backbone.Collection;
var StuffModel = Backbone.RelationalModel;

在一个地方,我用模型创建了该集合的一个实例:

var stuffCollection = new StuffCollection();
// do stuff here to load a bunch of models

在另一个地方,我想克隆该集合以进行编辑而不编辑原始:

var tempStuffCollection = new StuffCollection();
tempStuffCollection.reset(stuffCollection.models);
// do stuff here to edit the collection

但是当我在 tempStuffCollection 中编辑模型时,他们在 stuffCollection 中编辑 所以我尝试了这个:

var tempStuffCollection = new StuffCollection();
tempStuffCollection.reset(stuffCollection.toJSON());
// do stuff here to edit the collection

所以看起来所有的引用都被删除了......但没有!当我在 tempStuffCollection 中编辑模型时,它仍然会在 stuffCollection 中更改它们!

如何分离两个模型集合??

【问题讨论】:

    标签: javascript backbone.js backbone-relational


    【解决方案1】:

    您将需要克隆该集合。这是一种方法。

    var tempStuffCollection = new StuffCollection();
    stuffCollection.each(function(model) {
      tempStuffCollection.add(new Backbone.Model(model.toJSON()));
    });
    

    【讨论】:

    • 你的意思是:tempStuffCollection.add(new Backbone.Model(model.toJSON()));
    • 这对我不起作用,但我也在使用 Backbone 关系模型...我收到此错误:无法实例化多个 Backbone.RelationalModel,每种类型具有相同的 id!
    【解决方案2】:

    您的问题似乎是您不能拥有两次相同的模型。所以你可以这样做:

    var tempStuffCollection = new StuffCollection();
    stuffCollection.each(function(model) {
      var json = model.toJSON();
      json._id = json.id; // _id is maybe a reserved attribute, change it if needed
      delete json.id;
      tempStuffCollection.add(new Backbone.Model(json));
    });
    

    然后做逆运算……

    【讨论】:

      【解决方案3】:

      它可能对您不起作用的原因是 Backbone Relational 发现您放入临时集合中的模型与原始集合中的模型相同,因此它使用旧模型代替。它通过查看每个模型的 idAttribute 来做到这一点。

      因此,您可以尝试在将模型放入临时集合时更改模型的 idAttribute 名称,然后在完成后将其改回。

      也许像这样将它们放入您的临时集合中:

      var parsedStuffCollection = stuffCollection.toJSON()
      
      _.each(parsedStuffCollection, function(stuffAttributes){
          stuffAttributes.tempIDAttribute = stuffAttributes.myIdAttribute;
          delete stuffAttributes.myIdAttribute;
      })
      
      var tempStuffCollection = new StuffCollection({parsedStuffCollection});
      

      然后,只需执行相反的操作即可将它们改回

      编辑:刚刚意识到这与 Loamhoof 的回答完全相同

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-05-30
        • 2015-08-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-09-05
        • 2015-03-13
        相关资源
        最近更新 更多