如何将模型插入特定索引中的backbone.js集合?

时间:2012-04-17 16:20:50

标签: javascript jquery backbone.js

我需要将模型插入到Collection.length-2位置的Collection中。集合中的最后一个模型应该始终保持集合中的最后一个模型。

到目前为止我尝试了什么:

我在收集“页面”中添加了一个“页面”模型,然后尝试通过更改它们的顺序来交换它们:

var insertedpage = Pages.at(Pages.length-1);
var lastpage = Pages.at(Pages.length-2);
insertedpage.set({sequence: Pages.length-1});
lastpage.set({sequence: Pages.length});

我还尝试删除最后一页,然后添加新页面,然后重新添加最后一页。

var lastpage =  Pages.pop();
Pages.add({example1: example2});
Pages.push(lastpage);

这些都没有奏效。新添加的页面仍显示为Collection中的最后一个模型。在此之后我需要调用某种订单功能吗?

3 个答案:

答案 0 :(得分:55)

Backbone.Collection.add()使用支持options键的at对象来指定索引。

  

通过{at: index}将模型拼接到指定index的集合中。

示例:

Pages.add({ foo: bar }, { at: Pages.length - 2 })

答案 1 :(得分:9)

与Rob Hruska一样,在at对象中使用Backbone.Collection.add()options

Pages = new Backbone.Collection([
  {id:1, foo:'bar'},
  {id:2, foo:'barista'}  /* Last model should remain last */
]);

/* Insert new "page" not at the end (default) but length minus 1 */
Pages.add({id:3, foo:'bartender'}, { at: Pages.length - 1 });

Pages.at(0).id === 1; // true
Pages.at(Pages.length - 2).id === 3; // true
Pages.at(Pages.length - 1).id === 2; // true

您提到Pages似乎按属性sequence排序;你碰巧在Pages集合上定义了comparator函数吗?

另一个问题,当您将新页面添加到第二个位置时,是否要在集合中当前所有现有页面模型上更新此属性sequence?或者那个属性试图完成你原来的问题?

答案 2 :(得分:3)

对不起,简单回答(没时间回复),但请看定义比较器功能。

http://backbonejs.org/#Collection-comparator