我有一个本地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
)并合并任何发现。
答案 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)
}
})