18

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

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

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

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);

这些都不起作用。新添加的页面仍然显示为集合中的最后一个模型。在此之后我需要调用某种订单函数吗?

4

3 回答 3

57

Backbone.Collection.add()接受一个支持指定索引options的键的对象。at

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

例子:

Pages.add({ foo: bar }, { at: Pages.length - 2 })
于 2012-04-17T16:24:29.763 回答
9

按照与 Rob Hruska 相同的建议,在对象中使用Backbone.Collection.add()with 。atoptions

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;你碰巧comparator在 Pages 集合上定义了一个函数吗?

另一个问题,当新页面添加到第二个到最后一个位置时,您是否要更新sequence集合中当前所有现有页面模型的此属性?还是该属性是为了完成您最初的问题?

于 2012-04-18T06:07:43.450 回答
3

很抱歉简短的回答(没有时间回复),但看看定义一个比较器函数。

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

于 2012-04-17T18:18:17.900 回答