2011-09-06 16 views
69

Tutti gli esempi eliminazione diretta che ho trovato sembra di aggiungere una nuova voce alla fine di un ObservableArray usando qualcosa come:Come aggiungere/inserire un elemento in un ObservableArray in una certa posizione con Knockout.js

viewModel.SomeItems.push(someNewItem); 

Questo ovviamente posiziona l'oggetto alla fine dell'array.

Come si aggiunge un oggetto a ObservableArray in una determinata posizione?

es. qualcosa di simile:

viewModel.SomeItems.push(someNewItem, indexToInsertItAt); 

risposta

78

Si dovrebbe essere in grado di utilizzare il nativo metodo JavaScript splice -

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

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

Esempio qui (non Knockout specifico) - How to insert an item into an array at a specific index?

Dai documenti Knockout -

Per le funzioni che modificano i contenuti della matrice, come la spinta e giunzione, i metodi di KO scattare automaticamente la dipendenza di monitoraggio meccanismo in modo che tutti gli ascoltatori registrati vengono informate del cambiamento, e l'interfaccia utente viene aggiornato automaticamente.

+6

Grazie. La giuntura ha funzionato. Per gli utenti a eliminazione diretta, ko.utils.arrayIndexOf è utile anche se si desidera trovare l'indice per inserire il nuovo elemento in base a un elemento esistente. –

+1

Questo non funzionerà con gli array sparsi, almeno non ha fatto per me in chrome. Vedere la mia risposta di seguito –

17

Per uso knockout

viewModel.SomeItems.unshift(someNewItem); 

Consulta anche: http://knockoutjs.com/documentation/observableArrays.html

+14

Questo inserisce l'elemento all'inizio della matrice, quindi non aiuta se si desidera inserire un oggetto seomwhere nel mezzo. –

+1

In qualche modo mi sono perso la parte relativa all'inserimento in qualsiasi punto dell'array. Sì, funziona solo se vuoi inserirli all'inizio. Mi dispiace per quello – TravCav

+0

Mhh non riesco a creare un'animazione interessante quando si inserisce – konzo

12

ho fatto questa funzione di estensione che ha funzionato bene per me. Splice non funzionava per me se aggiungessi alla fine di una matrice sparsa.

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

questo funziona anche con:

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

E se si desidera eseguire insertAt piuttosto che setAt, basta cambiare 'this() [indice] = valore;' a 'this.splice (indice, 0, valore); '. Grazie Adam! –

Problemi correlati