TL; DR:如果我从服务器轮询整个模型集合,如何将更改后的属性合并到每个模型中,并从集合中添加/删除添加/删除的模型?合并主干集合与服务器响应
在我的骨干应用程序中,我正在轮询整个模型集合。我有一个Backbone.Collection
,我基本上每次都在呼吁reset
我得到的车型阵列,所以:
myCollection.reset(server_response);
与此唯一的问题是,它摆脱了老款的,那种消除的好处模型上的事件。这当然是reset
的目的,但我想要做的只是修改模型的已更改属性,并删除不在响应中的模型,并添加响应中的模型,但不添加集合中的模型。
本质上我想要一种合并的数据。
对于模型是在响应和收集已经在,我相信我可以做model.set(attributes)
,它需要照顾set
荷兰国际集团只有实际改变的,触发的过程中change
事件。这很棒。
但是,我如何处理模型在响应中但不在集合中的情况,反之亦然,而不是在响应中,而是在集合中?
我所提出的解决方案
我不知道,如果骨干已经有这样做的方式,我可能会过于复杂这就是为什么我问,但我想创建一个方法,然后在我的收藏中获得通过server_response
。
它将获得server_response
的所有id
属性以及集合中已有模型的所有id
属性。
id
在回应中的差异 - 集合会=添加模型,反之亦然将被删除模型。从集合中分别添加和删除这些模型。
两组id
的交集都是修改后的模型,所以遍历这些id
's并简单地做一个collection.get(id).set(attributes)
。
在pseudocoffeescript:
merge: (server_response) =>
response_ids = _.pluck(server_response, 'id')
collection_ids = @pluck('id')
added = _.difference(response_ids, collection_ids)
for add in added
@add(_.find(server_response, (model) ->
return model.id == add
))
removed = _.difference(collection_ids, response_ids)
for remove in removed
@remove(@get(remove))
changed = _.intersection(response_ids, collection_ids)
for change in changed
@get(change).set(_.find(server_response, (model) ->
return model.id == change
))
*>在pseudocoffeescript:*哦,上帝。 –
它实际上是coffeescript,我的意思是伪造的,因为我还没有测试它,但哈哈。 –