2012-10-31 8 views
6

Wiem na pewno, że można tworzyć wiązania 2-way w knockout.js. To zmienia model w javascriptu po zmianie widoku i odwrotnie. Potrzebuję sposobu, aby powiadomić i wysłać te zmiany z powrotem na serwer. Więc potrzebuję zrobić post na serwerze. Jak mogę to zrobić?Knockout.js z powrotem do serwera, aby zaktualizować model

Mam na myśli to, że muszę jakoś dołączyć obsługę zdarzeń, więc ilekroć raz zmieniam moje modele, automatycznie przesyła ona z powrotem do serwera zmiany.

Odpowiedz

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

Nie powinno być potrzeby indywidualne "Manual subskrypcjami" dla każdego obiektu ViewModel. Po prostu zdefiniuj numer ko.computed. Wszystkie ko.computed s są automatycznie powiadamiane o zmianach obserwowanych obiektów, na których one polegają. W powyższym kodzie obliczane zależy od wartości obserwowanych value1 i value2 (w argumencie data funkcji jQuery $.ajax). Za każdym razem, gdy wartość obserwowalnych zmian zostanie zmieniona, zapakowana funkcja ko.computed wykona i prześle nową wartość (y) do serwera.

+0

To działa - prawie. Wygląda na to, że publikuje się, gdy strona ładuje się po raz pierwszy. W jaki sposób zapobiegać temu po raz pierwszy? – Shadow

+0

Znalazłem sposób obejścia pierwszego obciążenia. 'funkcja MyViewModel() {self.firstload = true; ko.computed (funkcja {self.value1(); jeśli (firstload) zwraca firstload = false; $. Post ("/ścieżka/do/punkt końcowy ", {dane: self.value1();});}}} '(użyj http://jsbeautifier.org/: P) – Shadow

0

to zrobić za pomocą JSON (tylko w jedną stronę):

załadować ko wiązania z json string (przykład):

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

Wyślij zmieniony ko obiekt z powrotem do serwera (przykład):

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

Przykro mi, że źle to sformułowałem, ale muszę automatycznie przesłać zmiany z powrotem na serwer, a użytkownik końcowy nie będzie robił nic poza zmianą widoku. Potrzebuję tylko sposobu na dodanie niestandardowego kodu, gdy właściwość zostanie zmieniona w moim modelu. – Alecu

+0

jest w porządku. Zgaduję już, że piszę odpowiedź, której nie można znaleźć. Ale zaznaczona odpowiedź jest celem. – derlinuxer

1

Co powiesz na manual subscription?

  • subskrypcje ręczne mogą być traktowane jak wiązań dla Twojego modelu widoku. Powiązania umożliwiają interfejs użytkownika reagowanie na zmiany w modelu widoku, natomiast ręczne subskrypcje pozwalają modelowi podglądu reagować na zmiany samego siebie. Może to oznaczać aktualizowanie innych powiązanych obiektów w twoim modelu widoku.

  • Typowym przykładem jest uruchomienie aktualizacji obserwowalnej za pośrednictwem AJAX, gdy inne obserwowalne zmiany, na przykład gdy pole wyboru jest zaznaczone lub zmieniona jest wartość rozwijana. W tym przypadku subskrypcja ręczna działa jak obserwowane obliczenie asynchroniczne.

Powiązane problemy