0

我有一个本地骨干集合:

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,而这里我们没有任何ids(在本地集合中)。在这种情况下,greeting是我的唯一标识符/密钥。

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

4

2 回答 2

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();
于 2013-04-11T23:03:28.070 回答
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)
  }
})
于 2013-04-11T23:21:27.027 回答