2012-04-17 18 views
16

Potrzebuję wstawić model do kolekcji w pozycji Collection.length-2. Ostatni model w kolekcji powinien zawsze pozostać ostatnim modelem w kolekcji.Jak wstawić model do kolekcji backbone.js w określonym indeksie?

Co próbowałem dotąd:

dodałem jedną „stronę” model do „Strony” zbieranie i następnie próbował zamienić je dookoła, zmieniając ich kolejność:

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

Próbowałem też do usuń ostatnią stronę, a następnie dodaj nową stronę, a następnie dodaj ostatnią stronę z powrotem.

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

Żadna z nich nie zadziałała. Nowo dodana strona nadal pojawia się jako ostatni model w Kolekcji. Czy po tym muszę wywołać funkcję kolejności?

Odpowiedz

3

Przepraszamy za krótką odpowiedź (nie mam czasu na odpowiedź), ale wygląda na definiowanie funkcji porównawczej.

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

+0

dzięki, że to naprawiłem! Opiszę w opisie pytania, jak to zrobiłem. – Dine

+1

@NICCAI - Link nie działa. –

54

Backbone.Collection.add() pobiera obiekt options obsługujący klucz at do określania indeksu.

Przełóż {at: index}, aby splajnować model w kolekcji pod podanym index.

Przykład:

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

Dzięki za odpowiedź. Chodzi o to, że moje strony wydają się być posortowane według atrybutu "sekwencja". Przekazywanie opcji "przy" podczas dodawania nowego modelu nie zmienia wartości sekwencji. Czy istnieje sposób, w jaki mogę je zmienić przy dodawaniu nowego modelu, a następnie zmienić kolejność kolekcji w zależności od sekwencji? – Dine

+0

dziękuję, to bardzo przydatne, nie wiedziałem wcześniej o opcji at. Tym, co naprawiło to dla mnie, była funkcja komparatora, więc przyjmuję tę odpowiedź. – Dine

9

Przy tej samej sugestii, jak Roba Hruska użyć Backbone.Collection.add() z at w obiekcie 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 

Wspomniałeś, że Pages wydaje się być klasyfikowane według atrybutu sequence; Czy zdarzyło Ci się mieć zdefiniowaną funkcję comparator w kolekcji Strony?

Kolejne pytanie, czy chcesz zaktualizować ten atrybut sequence na WSZYSTKICH istniejących modelach stron w kolekcji, kiedy nowa strona zostanie dodana do drugiej do ostatniej pozycji? A może ten atrybut był próbą zrealizowania pierwotnego pytania?

+0

dzięki, pomogło. – Dine

Powiązane problemy