27

假设有 2 个 Collections,分别代表/api/page/1/api/page/2;无论如何(例如通过下划线)将这两个集合合并到一个新的单一集合中?

4

6 回答 6

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);
于 2012-09-12T09:36:56.790 回答
41

试试这个,集合是模型数组

collection1.add(collection2.models); 

如果我们使用

 collection1.add(collection2.toJSON());

然后参考 chage

于 2012-09-15T06:20:36.687 回答
5
collection.add(models, [options]) 

集合是模型数组

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..
于 2012-09-12T09:32:54.123 回答
5

采用

collection.models

安装的

collection.toJSON()
于 2012-09-12T10:55:29.263 回答
0

在我看来,这样做会失去与/api/page/{1, 2}/.

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

所以你的选择:

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

但您可能已经知道这一点。

于 2012-09-12T08:40:48.070 回答
0

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

于 2012-09-12T09:45:25.523 回答