骨干 - 将2个集合合并在一起?

时间:2012-09-12 08:30:56

标签: javascript backbone.js

假设有2个集合,分别代表/api/page/1/api/page/2;无论如何(通过Underscore)将这两个集合合并为一个新的单一集合?

5 个答案:

答案 0 :(得分:49)

选项1

如果你还没有提取集合,你可以获取第一个,然后使用{add:true}标志获取第二个,第二个将合并到第一个:

collection.fetch({data : {page : 2});
=> [{id: 1, article : "..."}, {id: 2, article : "..."}];
collection.fetch({data : {page : 2}, add : true });
=> [{id: 1, article : "..."}, {id: 2, article : "..."}, {id: 3, article : "..."}];

选项2

如果您已经提取了集合并将它们存储在两个变量中,您只需将第二个集合的所有内容添加到第一个集合中:

collection1.add(collection2.toJSON());

这个选项会受到以下事实的影响:第一个集合将在添加第二个集合时触发“add”事件。如果这有副作用,例如由于此事件而重新呈现的不需要的UI,则可以通过添加{silent:true}标志来抑制它

collection1.add(collection2.toJSON(), {silent : true});

选项3

如果您只需要这些集合的JSON格式,即出于HTML模板呈现的目的,您可以将所有内容减少为JS文字(数组,对象):

collection1.toJSON().concat(collection2.toJSON());
=> [{id: 1, article : "..."}, {id: 2, article : "..."}, ...];

选项4 =选项2 + 3

如果你已经提取了两个集合,你可以减少到JS文字并将所有内容添加到一个新的Backbone集合

var rawCollection = collection1.toJSON().concat(collection2.toJSON());
var newCollection = new Backbone.Collection(rawCollection);

答案 1 :(得分:5)

collection.add(models, [options]) 

Collection是模型数组

collection.models

返回模型数组

将一个模型(或一组模型)添加到集合中。

A = Backbone.Collection;
collection1 = new A([
    {key, 'value'},                  //model1
    {key : value1}                   //model2 in collection1
]);

B = Backbone.Collection;
collection2 = new B([
    {key1, 'value'},                 //model1
    {key1 : value1}                  //model2 in collection2
]);


collection1.add(collection2.models);  //now, collection1 has four models..

答案 2 :(得分:5)

使用

collection.models

而不是

collection.toJSON()

答案 3 :(得分:0)

在我看来,通过这样做,你失去了与/api/page/{1, 2}/绑定的语义。

在我看来,无论是主干,还是下划线,都没有为您提供完全符合您要求的功能/方法。

所以你的选择:

  • 创建一个新集合,添加以前集合中的每个项目;
  • 将第一个收集项添加到第二个

但你可能已经知道了这一点。

答案 4 :(得分:0)

Collection.models提供对moels数组的直接访问,而Collection.add将采用一组模型作为参数。