将本地Backbone集合与服务器合并

时间:2013-04-11 21:55:20

标签: backbone.js collections models

我有一个本地Backbone集合:

var collection = new Backbone.Collection([ { greeting: "hi" }, { greeting: "bye" } ]);

我了解当我运行collection.fetch时,Backbone将对结果运行collection.set。但是,我需要合并来自服务器的响应。说响应是:

[ { id: "2", greeting: "hi", name: "Bob" } ]

我希望合并后生成的集合为:

[ { id: "2", greeting: "hi", name: "Bob" }, { greeting: "bye" } ]

我知道Backbone已经尝试在这里进行一些合并,但如果我set上面的示例响应,则不会发生合并,而是添加新模型。我假设这是因为它由id合并,而在这里我们没有任何id(在本地集合中)。在这种情况下,greeting是我的唯一标识符/密钥。

我尝试这样做的原因是因为我有一个本地集合,我只想查看该集合中已存在的内容(使用密钥greeting)并合并任何发现。

2 个答案:

答案 0 :(得分:1)

您可以告诉骨干对模型的id属性使用不同的键:

GreetingModel = Backbone.Model.extend({
  idAttribute: "greeting"
});

GreetingCollection = Backbone.Collection.extend({
  model: GreetingModel
});

http://backbonejs.org/#Model-idAttribute

编辑:我想您可以为本地和服务器端使用两个单独的集合。

var localCollection = new Backbone.Collection([ { greeting: "hi" }, { greeting: "bye" } ]);

ServerCollection = Backbone.Collection.extend({
  url: "/api/"
  ...
});

var serverCollection = new ServerCollection({});

serverCollection.on("reset", function() {   
    localCollection.each(function(localModel) {
        var greeting = localModel.get("greeting");
        serverModel = serverCollection.findWhere({greeting: greeting});
        if(serverModel) {
            localModel.set(serverModel.attributes);          
        } 
    });
});

serverCollection.fetch();

答案 1 :(得分:1)

我的解决方案:

feeds.fetch({
  add: false,
  remove: false,
  merge: false,
  data: params,
  success: function (feeds, response) {
    // Merge any matches
    _.each(response.results, function (result) {
      _.each(feeds.models, function (feed) {
        // We have to `parse` the result before setting it, as Model#set does
        // not automatically run `parse` (Collection#set does).
        result = feed.parse(result)
        if (feed.get('rssUrl') === result.rssUrl) feed.set(result)
      })
    })
    cb(feeds)
  }
})
相关问题