2012-04-17 15 views
16

Necesito insertar un modelo en una Colección en la posición Colección.length-2. El último modelo de la colección siempre debe ser el último modelo de la colección.¿Cómo inserto un modelo en una colección backbone.js en un índice específico?

lo que he intentado hasta ahora:

he añadido un modelo de "página" de las "Páginas" Collection y luego trataron de intercambiarlos en torno al cambiar su secuencia:

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

También traté elimine la última página, luego agregue una nueva página y luego agregue la última página nuevamente.

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

ninguno de estos funcionó. La página recién agregada todavía aparece como último modelo en la Colección. ¿Debo llamar a algún tipo de función de orden después de esto?

Respuesta

3

Lo siento por la respuesta breve (no tienen tiempo para responder), pero un vistazo a la definición de una función de comparación.

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

+0

gracias que lo arregló! Describiré en la descripción de la pregunta cómo lo hice. – Dine

+1

@NICCAI - El enlace está muerto. –

54

Backbone.Collection.add() toma un objeto options que admite una clave at para especificar el índice.

Pase {at: index} para empalmar el modelo en la colección en el index especificado.

Ejemplo:

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

Gracias por la respuesta. Lo que pasa es que mis páginas parecen ordenarse por el atributo "secuencia". Pasar la opción "at" al agregar un nuevo modelo no parece cambiar los valores de secuencia. ¿Hay alguna manera de hacer que cambien al agregar un nuevo modelo y luego reordenar mi colección dependiendo de la secuencia? – Dine

+0

gracias, eso es muy útil, antes no sabía sobre la opción a. Lo que lo solucionó fue la función de comparación, así que aceptaré esa respuesta. – Dine

9

lo largo de la misma sugerencia como Rob Hruska, utilice Backbone.Collection.add() con at en el objeto 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 

Usted ha mencionado que Pages parece ser ordenados por el atributo sequence; ¿tiene una función comparator definida en la colección Páginas?

Otra pregunta, ¿desea actualizar este atributo sequence en TODOS los modelos de página existentes actualmente en la colección cuando una nueva página se agrega a la 2da a la última posición? ¿O fue ese atributo un intento de cumplir su pregunta original?

+0

gracias, eso ayudó. – Dine

Cuestiones relacionadas