Mam kolekcję ObservableArray
, która wiąże się z tabelą HTML z opcją edycji zbiorczej (MVC3), za każdym razem, gdy użytkownik wykonuje zatwierdzenie, które chciałem wysłać tylko zmodyfikowane wiersze z kolekcji zamiast wysyłać całą listę viewmodel, radzę wybrać najlepszy sposób śledzenia lub filtrowania tylko zmodyfikowanych wierszy.Najlepszy sposób na uzyskanie tylko zmodyfikowanych wierszy z obserwowalnego pola (gdy dostępna jest opcja edycji zbiorczej)
Odpowiedz
Oto post o tworzeniu brudną flagę nokautem które będą śledzić zmiany we wszystkich obserwabli w obiekcie.
Zazwyczaj dodajesz brudną flagę do każdego elementu w swojej tablicy w funkcji konstruktora lub przechodzisz przez pętlę przez każdy element i dodajesz flagę. Następnie można utworzyć obliczone obserwowalne, aby reprezentować tylko zmienione elementy do wysyłania z powrotem do serwera.
Oto przykład, który pokazuje brudną flagę na każdej pozycji i obliczony zaobserwować, że zawiera tylko brudne elementy: http://jsfiddle.net/rniemeyer/wauwn/
To nie jest tak trywialne zadanie, jak może wyglądać.
Najpierw tablica obserwowalna obsługuje tylko modyfikację tablicy (wstawianie, usuwanie, zmiana kolejności itp.), A nie modyfikację elementu.
Po drugie, prawdopodobnie potrzebujesz specjalnej flagi, takiej jak "isModified" w modelu, która wiąże się z każdym wierszem tabeli.
Następnie należy ustawić tę flagę, jeśli część wiązania została zaktualizowana. Obserwacje Knockoutjs umożliwiają subskrybcję metody, która pozwala na wywoływanie własnej funkcji podczas aktualizacji obserwowanych obiektów. Spójrz na stronę http://knockoutjs.com/documentation/observables.html u dołu znajduje się sekcja "wyraźnie subskrybuj obserwowalne".
Jest szybki projekt kodu, który wykonuje to zadanie
function CreateArrayElementViewModel(inputData) {
// Creating our view model
var result = {
prop : ko.observable(inputData.prop),
val : ko.observable(inputData.val),
isModified: false // This property would be true if entity was edited
};
// Iterate over all properties and subscribe to knockoutjs observables
for(prop in result) {
if (typeof(result[prop].subscribe) != 'undefined') {
result[prop].subscribe(function() { result.isModified = true; });
}
}
return result;
}
Sprawdź, zapisz to funkcja, aby mieć pewność, jesteś tylko testowanie że właściwość istnieje . Test powinien brzmieć: 'result.hasOwnProperty (prop) && typeof result [prop] ===" function "' – froginvasion
twoje rozwiązanie jest idealne. Czy myślisz o przesłaniu tego ko.dirtyFlag do zespołu ko? –
Jestem w zespole ko core (tylko 3 osoby ze Stevem Sandersonem, głównym programistą). Obecne myślenie ma na ogół na celu utrzymanie ścisłego sedna i wprowadzenie takich rzeczy do wtyczek. Może jednak uważam to za odpowiedni projekt. –