2011-09-06 17 views
69

Todos los ejemplos que he encontrado knockout parecen añadir un nuevo elemento al final de un ObservableArray usando algo como:¿Cómo añadir/insertar un elemento en un ObservableArray en una posición determinada con Knockout.js

viewModel.SomeItems.push(someNewItem); 

Esto, por supuesto, coloca el elemento al final de la matriz.

¿Cómo agrego un elemento al ObservableArray en una determinada posición?

por ejemplo. algo así como:

viewModel.SomeItems.push(someNewItem, indexToInsertItAt); 

Respuesta

78

Usted debe ser capaz de utilizar el nativo método JavaScript splice -

viewModel.SomeItems.splice(2,0,someNewItem); 

Docs aquí - https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/splice

Ejemplo aquí (no Knockout específica) - How to insert an item into an array at a specific index?

De los documentos Knockout -

Para las funciones que modifican el contenido de la matriz, como el empuje y de empalme, los métodos de KO disparar automáticamente la dependencia de seguimiento mecanismo de modo que todos los detectores registrados son notificados del cambio, y la interfaz de usuario se actualiza automáticamente.

+6

Gracias. Splice funcionó. Para los usuarios knockout, ko.utils.arrayIndexOf también es útil si desea encontrar el índice para insertar su nuevo elemento en función de un elemento existente. –

+1

Esto no funcionará con matrices dispersas, al menos no lo hizo para mí en Chrome. Ver mi respuesta a continuación –

17

Para uso nocaut

viewModel.SomeItems.unshift(someNewItem); 

Consulte también: http://knockoutjs.com/documentation/observableArrays.html

+14

Esto inserta el elemento al comienzo de la matriz, por lo que no ayuda si desea insertar un elemento en el medio. –

+1

De alguna manera me perdí la parte de insertarlo en cualquier lugar de la matriz. Sí, esto solo funciona si quiere insertarlo al principio. Lo siento por eso. – TravCav

+0

Mhh no puedo crear una animación genial cuando inserto – konzo

12

Hice esta función de extensión que funcionó muy bien para mí. Splice no funcionaba para mí si estaba agregando al final de una matriz dispersa.

ko.observableArray.fn.setAt = function(index, value) { 
    this.valueWillMutate(); 
    this()[index] = value; 
    this.valueHasMutated(); 
} 

Esto funciona incluso con:

var a = ko.observableArray(['a', 'b', 'c']); 
a.setAt(42, 'the answer'); 
+2

Y si desea insertar InsertAt en lugar de setAt, simplemente cambie 'this() [index] = value;' a 'this.splice (index, 0, value); '. Gracias Adam! –

Cuestiones relacionadas