Gdy masz tablicę obserwowalną z nieobserwowalnymi elementami i niektóre właściwości jednego z elementów w tablicy zmian jeśli chcesz odświeżyć tylko ten element, można użyć indexOf
i splice
coś takiego:
var changedIdx = obsArray.indexOf(changedItem);
obsArray.splice(changedIdx , 1); // removes the item from the array
obsArray.splice(changedIdx , 0, changedItem); // adds it back
Co to robi, szuka elementu w tablicy, usuwając je i wkładając ją do tyłu. Po ponownym wstawieniu element jest ponownie powiązany z nowymi wartościami.
Jeśli podoba Ci się to rozwiązanie, można rozszerzyć funkcjonalność wszystkie Ko obserwowalnych tablic, jak poniżej:
ko.observableArray.fn.refresh = function (item) {
var index = this['indexOf'](item);
if (index >= 0) {
this.splice(index, 1);
this.splice(index, 0, item);
}
}
Następnie, po zmianie elementu tablicy, po prostu trzeba zrobić to wezwanie:
obsArray.refresh(changedItem);
Jeśli masz wiele elementów macierzy dostaniesz lepszą występ względem dirty
odświeżyć Artem Vyshniakov, które aktualizacje powiązań dla wszystkich elementów w tablicy, a nie tylko dla jednej zmienionej .
Uwaga: valueHasMutated
, appart przed nieudokumentowane (oraz do użytku wewnętrznego, jak sądzę), tylko sprawdza, czy sama tablica uległa zmianie, nie, jeśli nie obserwowalne elementy w tablicy uległy zmianie, więc nie robi” t działa. To znaczy. wykrywa tylko, czy dodano elementy do tablicy, usunięto elementy z tablicy, zmieniono elementy tablicy za pomocą nowych, różnych elementów lub zmieniono kolejność elementów. Ale nie sprawdza, czy same elementy uległy zmianie
To nadal nie aktualizuje dla mnie interfejsu użytkownika – user1166905
valueHasMutated działało dobrze dla mnie. – Edyn
dlaczego trzeba wykonać kopię tablicy, wywołując slice (0)? działa również i jeszcze lepiej 'var data = self.array(); self.array (null); self.array (dane);' –