2012-10-31 7 views
6

Ich weiß für eine Tatsache, dass Sie 2-Wege-Bindungen in knockout.js erstellen können. Dies ändert das Modell in JavaScript, sobald Sie die Ansicht und das Gegenteil ändern. Ich brauche eine Möglichkeit, diese Änderungen zu melden und an den Server zurückzusenden. Also muss ich ziemlich viel auf dem Server posten. Wie kann ich das machen?Knockout.js Beitrag zurück zum Server zu aktualisieren Modell

Was ich damit meine, ist, dass ich irgendwie einen Event-Handler anhängen muss, also wenn ich einmal von meinen Modellen ändere, meldet es automatisch die Veränderungen auf dem Server zurück.

Antwort

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() 
      } 
     }); 
    }); 
} 

Sie sollten nicht einzelne "manuelle Abonnements" müssen für jede Eigenschaft Viewmodel. Definieren Sie einfach eine ko.computed. Alle ko.computed s werden automatisch über Änderungen an den Observablen benachrichtigt, von denen sie abhängen. Im obigen Code hängt die Berechnung von den Observables Wert1 und Wert2 ab (im Argument data der Funktion jQuery $.ajax). Wenn sich der Wert einer Observablen ändert, wird die umbrochene ko.computed-Funktion ausgeführt und der/die neue (n) Wert (e) an den Server gesendet.

+0

Das funktioniert - fast. Es scheint zu posten, sobald die Seite das erste Mal geladen wird. Gibt es einen Weg dies zu verhindern? – Shadow

+0

Ich habe einen Weg um die erste Ladung gefunden. 'Funktion MyViewModel() {self.firstload = true; ko.computed (Funktion {self.value1(); if (firstload) gibt firstload = false; $. Post zurück ("/Pfad/zu/Endpunkt ", {Daten: self.value1();});}}} '(benutze http://jsbeautifier.org/: P) – Shadow

0

ich es über json tun (nur einfache Fahrt):

laden Sie Ihre ko von JSON-String-Bindung (Beispiel):

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

sendet das geänderte ko Objekt zurück zum Server (Beispiel):

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

Nun, es tut mir leid, dass ich das falsch formuliere, aber ich muss die Änderungen automatisch an den Server zurücksenden, ohne dass der Endbenutzer etwas anderes tut, als die Ansicht zu ändern. Ich brauche nur eine Möglichkeit, um benutzerdefinierten Code hinzuzufügen, sobald eine Eigenschaft in meinem Modell geändert wurde. – Alecu

+0

ist es in Ordnung. Ich schätze schon, wenn ich die Antwort schreibe, ist es möglich, dass Sie nicht danach suchen. Aber die markierte Antwort ist das Ziel. – derlinuxer

1

Wie wäre es mit einem manual subscription?

  • Manuelle Abonnements können für Ihre Ansicht Modell wie Bindungen gedacht werden. Bindungen ermöglichen es Ihrer Benutzeroberfläche, auf Änderungen in Ihrem Ansichtsmodell zu reagieren, während manuelle Abonnements Ihrem Ansichtsmodell erlauben, auf Änderungen an sich selbst zu reagieren. Dies kann bedeuten, dass Aktualisierungen anderer verwandter Objekte in Ihrem Ansichtsmodell vorgenommen werden.

  • Ein häufiges Beispiel ist das Auslösen einer Aktualisierung einer Observablen über AJAX, wenn sich eine andere Observable ändert, beispielsweise wenn ein Kontrollkästchen aktiviert oder ein Dropdown-Wert geändert wird. In diesem Fall verhält sich die manuelle Subskription wie eine asynchrone berechnete Observable.

Verwandte Themen