2011-12-28 19 views
5

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

15

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/

+0

twoje rozwiązanie jest idealne. Czy myślisz o przesłaniu tego ko.dirtyFlag do zespołu ko? –

+0

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. –

2

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; 
} 
+0

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

Powiązane problemy