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

Din*_*ine 17 javascript jquery backbone.js

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

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

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

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});
Run Code Online (Sandbox Code Playgroud)

我还试图删除最后一页,然后添加一个新页面,然后重新添加最后一页.

var lastpage =  Pages.pop();
Pages.add({example1: example2});
Pages.push(lastpage);
Run Code Online (Sandbox Code Playgroud)

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

Rob*_*ska 55

Backbone.Collection.add()获取一个options支持at用于指定索引的键的对象.

传递{at: index}将模型拼接到指定的集合中index.

例:

Pages.add({ foo: bar }, { at: Pages.length - 2 })
Run Code Online (Sandbox Code Playgroud)


小智 9

与Rob Hruska一样的建议Backbone.Collection.add(),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
Run Code Online (Sandbox Code Playgroud)

你提到的Pages似乎是按属性排序sequence; 你碰巧comparator在Pages系列上定义了一个函数吗?

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


NIC*_*CAI 3

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

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