2012-10-31 33 views
6

我知道一個事實,你可以創建2個knockout.js方式綁定。這改變了JavaScript中的模型,一旦你改變視圖和相反。我需要一種方式來通知並將這些更改發送回服務器。所以我非常需要在服務器上發佈帖子。我怎樣才能做到這一點?Knockout.js回發到服務器以更新模型

什麼意思呢,就是我不知需要每當我​​換一次我的模型,它會自動回發到服務器的更改附加事件處理函數左右。

回答

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

你不應該需要單獨的 「手動訂閱」 每個視圖模型屬性。只需定義一個ko.computed。所有ko.computed都會自動通知他們所依賴的觀察值的更改。在上面的代碼中,計算依賴於值1和value2可觀測量(在data參數對jQuery $.ajax功能)。只要observable的值發生變化,包裝的ko.computed函數就會執行,並將新的值提交給服務器。

+0

這個工程 - 差不多。它似乎在頁面首次加載時立即發佈。有什麼辦法可以防止第一次發生? – Shadow

+0

我找到了第一個加載的方法。 '函數MyViewModel(){self.firstload = TRUE; ko.computed(功能{self.value1();如果(firstload)返回firstload =假; $後( 「/路徑/到/端點」,{數據: self.value1();});}}}'(使用http://jsbeautifier.org/:P) – Shadow

0

我通過JSON做到這一點(僅單程):

加載KO從JSON字符串(例如)結合:

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

發送改變KO對象返回給服務器(例如):

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

好吧,我爲正確制定這一令人感到遺憾,但我需要自動更改發送回服務器,而無需最終用戶做任何事情不是改變視圖別的。我只需要在我的模型中更改屬性後添加一些自定義代碼的方法。 – Alecu

+0

沒關係。我已經猜測寫出答案可能不是你正在尋找的。但明顯的答案是目標。 – derlinuxer

1

manual subscription怎麼樣?

  • 手冊訂閱可以被認爲您的視圖模型一樣的綁定。綁定允許您的用戶界面對視圖模型中的更改做出反應,而手動訂閱則允許您的視圖模型對自身的更改做出反應。這可能意味着更新視圖模型中的其他相關對象。

  • 一個常見的例子是通過AJAX觸發的更新,可觀察到的當另一個觀察的變化,當一個複選框被選中或下拉值被改變,如。在這種情況下,手動訂閱的行爲就像異步計算的觀察值。