2011-12-28 5 views

risposta

15

Ecco un post sulla creazione di una bandiera sporco in Knockout che traccia le modifiche a tutti osservabili in un oggetto.

In genere, si aggiunge una bandiera sporca a ciascun elemento dell'array in una funzione di costruzione o si scorre in ogni elemento e si aggiunge la bandiera. Quindi, è possibile creare un osservabile calcolato per rappresentare solo gli elementi modificati per l'invio al server.

Ecco un esempio che mostra una bandiera sporco su ogni articolo e un osservabile calcolato che contiene solo gli elementi sporchi: http://jsfiddle.net/rniemeyer/wauwn/

+0

la tua soluzione è perfetta. Hai pensato di inviare questo ko.dirtyFlag alla squadra ko? –

+0

Sono nella squadra di core del ko (solo 3 persone con Steve Sanderson lo sviluppatore principale). Il pensiero corrente è generalmente quello di mantenere il nucleo stretto e di mettere cose come questa in plugin. Potrei prendere in considerazione l'idea di metterlo come un vero e proprio progetto. –

2

Si è compito non così banale come può sembra.

Inizialmente, la matrice osservabile gestisce solo la modifica dell'array (inserire, rimuovere, riordinare ecc.) Non la modifica dell'elemento.

In secondo luogo, è probabile che sia necessario un contrassegno speciale come "isModified" nel modello che si lega a ciascuna riga della tabella.

allora avete bisogno di impostare quella bandiera se una parte del legame è stato aggiornato. Le osservabili di Knockoutjs forniscono il metodo subscribe che consente di richiamare la propria funzione quando viene aggiornato l'osservabile. Dai uno sguardo alla pagina http://knockoutjs.com/documentation/observables.html in fondo c'è una sezione chiamata "iscriviti esplicitamente agli osservabili".

C'è un breve progetto di codice che esegue questo compito

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

Controllare che sottoscrivere è una funzione per essere sicuri, si sono ora solo testando che una proprietà esiste . Il test dovrebbe essere: 'result.hasOwnProperty (prop) && typeof result [prop] ===" function "' – froginvasion

Problemi correlati