2013-03-15 12 views
31

Próbuję zastąpić całą zawartość elementu w observableArray nową treścią.Zamienianie elementu w observableArray

var oldLocation = ko.utils.arrayFirst(self.locations(), function (item) { 
    return item.id == value.id; 
}); 
self.locations.replace(self.locations.indexOf(oldLocation), new location(value)); 
self.locations.valueHasMutated(); 

Próbowałem zostały również

self.locations[self.locations.indexOf(location)] = new fizi.ko.models.location(value); 

Ale nic nie działa. Indeks jest prawidłowo pobierany, ale aktualizacja elementu nie ma miejsca.

+0

Co masz na myśli mówiąc "Ale nic nie działa."? Nie masz nowego przedmiotu w tablicy? Lub nie widzisz zastąpienia w interfejsie użytkownika? Opublikuj swój html i powiązania, a także jak wygląda obiekt lokalizacji! – nemesv

+0

zarówno. Model nie jest aktualizowany, podobnie jak interfejs użytkownika, ponieważ model nie jest aktualizowany. – bflemi3

Odpowiedz

45

Funkcja zamiany akceptuje dwa parametry, element, który chcesz wymienić, oraz nowy element, który chcesz zastąpić. Przechodzisz w indeksie zamiast elementu, który chcesz zastąpić, więc nie działa.

zastąpić połączenie powinno być:

self.locations.replace(oldLocation, new location(value)); 

Na marginesie, nie ma potrzeby połączenia valueHasMutated() istnieje, zostanie on wywołany przez wywołanie replace().

+9

Muszę zapytać, gdzie na Ziemia jest dokumentacją, która wymienia metodę zastępowania na tablicy obserwowalnej? Szukałem i patrzyłem, i nie widziałem go nigdzie w dokumentacji! –

+4

@PaulManzotti - pozycja 7 http://www.knockmeout.net/2011/06/10-things-to-know-about-knockoutjs-on.html wspomina o dodanych metodach. – DaveB

+1

Dzięki, zachowam tę zakładkę do zakładek! :) –

1

Nie jestem świadomy metody zamiany w JavaScript dla tablic ani w Knockout. Czy czegoś brakuje?

Jeśli chcesz użyć drugiej metody, to trzeba przejść lokalizacje jako obserwowalne:

self.locations()[self.locations.indexOf(location)] = new fizi.ko.models.location(value); 
self.locations.valueHasMutated(); 

choć nie przy użyciu indexOf, ponieważ nie jest to wersja z Knockout że dla obserwowalnych tablic .

+1

Nie widziałem go nigdzie udokumentowanego, ale jest w kodzie źródłowym: https://github.com/knockout/knockout/blob/master/src/subscribables/observableArray.js –

4

ja po prostu chcę wspomnieć alternatywny sposób to zrobić:

self.locations.splice(
    self.locations.indexOf(location), // Index of the 1st element to remove 
    1,         // Number of elements to remote at this index 
    new fizi.ko.models.location(value) // A param for each element to add at the index 
); 

Knockout obejmuje splice w swojej dokumentacji, lecz nie obejmuje replace: Knockout Obervable Arrays Docs. Jeśli jednak spojrzysz na kod źródłowy, zobaczysz, że obie funkcje są zaimplementowane (przynajmniej w wersji KO 3.0, nie wiem, czy w poprzednich wersjach brakowało replace).

Powiązane problemy