简体   繁体   中英

How do I insert a model into a backbone.js collection in a specific index?

I need to insert a model into a Collection at position Collection.length-2. The last model in the collection should always stay the last model in the collection.

What I tried so far:

I added one "page" model to the Collection "Pages" and then tried to swap them around by changing their sequence:

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

I also tried to remove the last page, then add a new page and then add the last page back in.

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

neither of these worked. The newly added page still appears as last model in the Collection. Do I need to call some kind of order function after this?

Backbone.Collection.add() takes an options object that supports an at key for specifying the index.

Pass {at: index} to splice the model into the collection at the specified index .

Example:

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

Along the same suggestion as Rob Hruska, use Backbone.Collection.add() with at in the options object.

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

You mentioned that Pages seems to be sorted by the attribute sequence ; do you happen to have a comparator function defined on the Pages collection?

Another question, did you want to update this attribute sequence on ALL existing page models currently in the collection when a new page is added to the 2nd to the last position? Or was that attribute an attempt to accomplish your original question?

Sorry for the brief answer (don't have time to respond), but look at defining a comparator function.

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM