1

我正在使用jQWidgets UI框架與Knockout.js和datajs庫(用於支持OData)構建我的應用程序的客戶端。以及服務器端的ASP.NET Web API2中的OData端點。我創建視圖模型爲jqWidgets電網如下代碼:Knockout observableArray vs WebApi Odata服務

var vm = function() { 
     this.items = ko.observableArray(); 
     var self = this; 

     //qet data from service 
     OData.read(url, 
      function success(data, response) { 
       //convert data to observable array 
       self.items(data.results); 
      }, 
      function error(err) { 
       alert(err.message); 
      }); 


     this.removeItem = function() { 
      // remove item 
      var element = "#jqxgrid"; 
      var cell = $(element).jqxGrid('getselectedcell'); 
      if (cell != null && cell != "") { 
       var selectedrowindex = cell.rowindex; 
      }; 

      var item =$(element).jqxGrid('getrowdata', selectedrowindex); 

      OData.request({ 
       requestUri: url + '(' + item.CompanyID + ')', 
       method: "DELETE", 
      }, 
      function success(data, response) { 
       alert('DELETE successfull'); 
      }, 
      function error(err) { 
       alert(err.message); 
      }); 
     }; 

正如你看到的,我可以得到和刪除項目。 我的問題是如何保存所有更改併發送更改的項目到服務器。對於服務器端的添加/更新實體,我必須向適當的json對象(而不是對象集合)發送POST/PUT請求。所以,例如,如果我想更新所有更改的項目,我必須爲每個項目執行PUT請求。 是否有任何方法來檢測observableArray中的哪些項目被添加/更改並將每個項目發送到服務器?

回答

1

淘汰賽不開箱即用。我過去所做的事情是在存儲在數組中的對象中設置一個isDirty標誌(假定你的對象被填充了observables,如果不是這樣做不行,並且沒有簡單的方法可以使用普通的js對象)。髒標誌監視可觀察的屬性以進行更改,並在啓用時將它設置爲true。然後保存正在作出時,你只是看到如果isDirty)我在你的代碼上面看到記錄(==真

var entryForm = function(){ 
var self = this; 
self.firstName = ko.observable(); 
self.lastName = ko.observable(); 
self.email = ko.observable(); 
self.dirty = ko.observable(false); 
self.dirtyCalculations = ko.computed(function(){ 
    //read from any observable we want to watch as part of our "dirty" calculation 
    self.firstName(); 
    self.lastName(); 
    self.email(); 

    //if any of the above changed, this method will be called, so this model is now "dirty" 
    self.dirty(true); 
}); 

//see the next section for an explanation of these lines 
self.resetDirtyFlag = function(){self.dirty(false);} 
self.resetDirtyFlag(); 
} 

你插入你的返回對象直入陣列,而不屬性轉換爲可觀察的。我會建議轉換屬性並使用上面的類似方法。

+0

謝謝!我想過這個案子。而且這似乎是解決我的問題最合適的方法。 – alinaish