在初始fetch
之后调用fetch
(响应用户的操作)时,许多新获取的模型可能与最初fetch
的现有模型类似。如果我使用fetch
选项调用add: true
,则集合中可能存在重复的模型。
问题:而不是从集合中删除所有现有模型(比如id=1,2,3,4
)并插入新获取的模型(id=1,2,3,5
),是否可以执行以下两项行动:
仅添加新模型id=5
,从而生成包含id=1,2,3,4,5
的集合。然后只渲染新视图(id=5
)
添加新模型id=5
并删除新fetch
(id=4
)中未找到的模型。然后渲染新视图(id=5
)并删除旧视图(id=4
)
尝试:
使用App.listingCollection.fetch()
函数,而不是调用fetchNew()
。这仅适用于将新模型id=5
添加到集合中。
如何在不重新渲染现有视图id=5
的情况下触发新视图的呈现(id=1,2,3,4
)?我使用new ListingMarkerView({ model:item }).render();
中的行ListingCollection
尝试了此操作,但在var marker = L.marker([this.model.get('lat'), this.model.get('lng')]);
中回复ListingMarkerView
行时收到错误:
错误
Uncaught TypeError: Object #<Object> has no method 'get'
集合
ListingCollection = Backbone.Collection.extend({
model: Listing,
url: '/api/search_by_bounds',
fetchNew: function(options) {
options = options || {};
var collection = this,
success = options.success;
options.success = function(resp, status, xhr) {
_(collection.parse(resp, xhr)).each(function(item) {
// added this conditional block
if (!collection.get(item.id)) {
collection.add(item, {silent:true});
new ListingMarkerView({ model:item }).render();
}
});
if (!options.silent) {
collection.trigger('reset', collection, options);
}
if (success) success(collection, resp);
};
return (this.sync || Backbone.sync).call(this, 'read', this, options);
}
});
查看
ListingMarkerView = Backbone.View.extend({
render: function() {
var marker = L.marker([this.model.get('lat'), this.model.get('lng')]);
markers.addLayer(marker);
},
close: function() {
this.unbind;
}
});
答案 0 :(得分:3)
一个宁静的API没有与它交谈的客户端状态的概念,因此在发出GET
请求来检索对象列表(例如http://example.com/restapi/user/)时,其余服务器应该总是返回一个完整的匹配对象列表。
在Backbone端,您应该只使用服务器中的列表.reset
集合。 .reset
将清空集合,然后添加所有项目,例如:
my_collection.fetch({success: function(collection, resp){
collection.reset(resp, {silent: true});
}});
这样你就不会发生碰撞而且你不必担心任何事情。除非您有模型,否则您已在本地集合中更改了尚未保存回服务器的模型。
如果您正在寻找一种方法来阻止修改集合中的本地商品,那就需要像上面提到的巫术一样。