我在谷歌地图对象上有一个位置集合,存储在Backbone集合中:
var Location = Backbone.Model.extend({
defaults: {
latitute: "",
longitude: "",
visited: false;
},
});
var LocationCollection = Backbone.Collection.extend({
model: Location,
url: 'api/locations'
});
当点击地图上的每个点时,位置模型属性"visited"将设置为true。
位置的原始集合来自数据库(基于地图的边界),该数据库不存储任何"访问过"的信息,只是范围内的位置列表。
当用户通过移动、放大/缩小等方式更改谷歌地图的边界时,我需要在新参数中检索一个全新的位置列表,然后以某种方式将该列表与现有集合同化,添加新位置,但为现有集合保留已访问的属性?
我希望这不是太模糊,但从哪里开始呢??jQuery有办法将复杂对象从一个集合映射到另一个集合吗?或者,拆分集合,将访问过的信息发送回服务器并在那里进行组合会更有意义吗?或者Backbone集合会记住"已访问"的值,并且只使用新属性更新集合中的值?
对不起,我以为我知道这些,但我从来没有做过这样的事。
这是可能的。基本上,我假设如下。用户有一堆位置。他们点击,位置属性变为visited = true;
当它们缩小时,fetch()
新模型现在在视图中,但您也希望不希望这些旧位置重置为visited = false;
服务器将基本上计算视图的尺寸,并提供一组位置模型。
如果这是您想要的,那么您所需要做的就是使用以下选项进行fetch()
调用:add:true
。
collection.fetch({
add: true
});
当您将add:true
选项传递给fetch()
调用时,它不会重置集合(从而擦除您访问的数据)。相反,它只会添加集合中不存在的模型。因此,如果您已经有locations.id=1,2,3,并且您的服务器返回locations.id=1,2,3,4,5,6。。。只有4、5、6将添加到您现有的收藏中。1、2、3的visited=true(或false)数据应保持完整。