2011-09-06 6 views

Odpowiedz

78

Powinieneś być w stanie korzystać z natywną JavaScript splice metody -

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

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

Przykład tutaj (nie nokaut specyficzne) - How to insert an item into an array at a specific index?

Z dokumentacji Knockout -

Dla funkcji, które modyfikują zawartość tablicy, takich jak naciśnięcie i spawu, metody KO automatycznie wyzwalać śledzenia mechanizm uzależnienia, tak aby wszyscy zarejestrowani słuchacze są powiadamiani o zmianach, a UI jest automatycznie aktualizowana.

+6

Dzięki. Splice działało. Dla użytkowników nokautów ko.utils.arrayIndexOf jest również przydatny, jeśli chcesz znaleźć indeks, aby wstawić nowy element na podstawie istniejącego elementu. –

+1

To nie działa z rzadkimi tablicami, przynajmniej nie dla mnie w chrome. Zobacz moją odpowiedź poniżej: –

17

Do stosowania pucharowej

viewModel.SomeItems.unshift(someNewItem); 

Zobacz także: http://knockoutjs.com/documentation/observableArrays.html

+14

Wstawia element na początku tablicy, więc nie pomaga, jeśli chcesz wstawić element seom, gdzieś pośrodku. –

+1

W jakiś sposób przegapiłem część o wstawieniu jej w dowolne miejsce tablicy. Tak, działa to tylko wtedy, gdy chcesz wstawić na początku. Przepraszam za to. – TravCav

+0

Mhh nie wydaje się tworzyć fajną animację podczas wstawiania – konzo

12

Zrobiłem to rozszerzenie funkcji, która pracowała ładnie dla mnie. Splice nie działało dla mnie, gdybym dodawał do końca rzadkiej tablicy.

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

To nawet współpracuje z:

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

A jeśli chcesz zrobić insertAt zamiast setAt, po prostu przełącz 'this() [index] = value;' na 'this.splice (index, 0, value); '. Dzięki Adam! –

Powiązane problemy