2012-10-31 10 views
6

So per certo che è possibile creare binding in 2 way in knockout.js. Questo cambia il modello in javascript dopo aver cambiato la vista e l'opposto. Ho bisogno di un modo per notificare e inviare queste modifiche al server. Quindi ho praticamente bisogno di fare un post sul server. Come posso fare questo?Knockout.js postback sul server per aggiornare il modello

Ciò che intendo con questo, è che in qualche modo ho bisogno di collegare un gestore di eventi così ogni volta che cambio una volta dei miei modelli automaticamente invia di nuovo al server le modifiche.

risposta

14
function MyViewModel() { 
    var self = this; 
    self.value1 = ko.observable(); 
    self.value2 = ko.observable(); 
    ko.computed(function() { 
     $.ajax({ 
      url: '/path/to/server/endpoint', 
      type: 'POST', 
      data: { 
       value1: self.value1(), 
       value2: self.value2() 
      } 
     }); 
    }); 
} 

Non dovrebbe essere necessario individuali "abbonamenti manuale" per ogni proprietà ViewModel. Basta definire un ko.computed. Tutti i numeri ko.computed vengono automaticamente avvisati delle modifiche alle cose osservabili da cui dipendono. Nel codice sopra, il calcolo dipende dalle osservabili value1 e value2 (nell'argomento data alla funzione jQuery $.ajax). Ogni volta che cambia il valore di un osservabile, viene eseguita la funzione wrapping ko.computed e inviare i nuovi valori al server.

+0

Questo funziona - quasi. Sembra pubblicare non appena la pagina viene caricata la prima volta. Un modo per evitare che ciò accada la prima volta? – Shadow

+0

Ho trovato un modo per aggirare il primo carico. 'function MyViewModel() {self.firstload = true; ko.computed (function {self.value1(); if (firstload) return firstload = false; $. Post ("/percorso/a/endpoint ", {dati: self.value1();});}}} '(usa http://jsbeautifier.org/: P) – Shadow

0

lo faccio tramite JSON (un solo modo):

caricare il ko vincolante da stringa JSON (esempio):

userSettingsModel = ko.mapping.fromJSON('${userSettingsJSON}'); 
    ko.applyBindings(userSettingsModel); 

inviare l'oggetto ko cambiato di nuovo al server (esempio):

function saveConferencesFilter() { 
    // console.log(ko.mapping.toJSON(userSettingsModel)); 
    $.ajax({ 
     type: 'PUT', 
     url: '/AudioPlace/userSettings/rest', 
     dataType: 'json', 
     contentType: 'application/json;charset=UTF-8', 
     data: ko.mapping.toJSON(userSettingsModel), 
     success: function (data) { 
      getConferences(); 
     } 
    }); 
} 
+0

Bene, mi dispiace per la formulazione non corretta, ma ho bisogno di inviare automaticamente le modifiche al server senza che l'utente finale faccia nient'altro che modificare la vista. Ho solo bisogno di un modo per aggiungere codice personalizzato una volta che una proprietà è stata cambiata nel mio modello. – Alecu

+0

va bene. Ho già indovinato su come scrivere la risposta che è possibile che tu non stia cercando. Ma la risposta marcata è l'obiettivo. – derlinuxer

1

Che ne dici di un manual subscription?

  • abbonamenti manuali possono essere pensati come binding per il vostro modello di vista. I collegamenti consentono all'interfaccia utente di reagire ai cambiamenti nel modello di visualizzazione, mentre gli abbonamenti manuali consentono al modello di visualizzazione di reagire alle modifiche a se stesso. Questo potrebbe significare fare aggiornamenti ad altri oggetti correlati nel tuo modello di vista.

  • Un esempio comune è l'attivazione di un aggiornamento di un osservabile tramite AJAX quando si modificano altre modifiche osservabili, ad esempio quando viene selezionata una casella di controllo o viene modificato un valore di discesa. In questo caso, l'abbonamento manuale agisce come un osservabile calcolato asincrono.

Problemi correlati