1

내 응용 프로그램의 클라이언트 측 빌드를 위해 Knockout.js 및 datajs 라이브러리 (OData 지원 용)와 함께 jQWidgets UI 프레임 워크를 사용하고 있습니다. 그리고 서버 측 ASP.NET 웹 API2의 OData Endpoint. 아래 코드와 같이 jqWidgets Grid 용 ViewModel을 생성했습니다.넉 아웃 observableArray 대 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); 
      }); 
     }; 

알다시피 항목을 가져 오거나 제거 할 수 있습니다. 내 문제는 모든 변경 사항을 저장하고 변경된 항목을 서버에 보내는 방법입니다. 서버 쪽에서 엔티티를 추가/업데이트하려면 POST/PUT 요청을 적절한 json 객체 (객체 컬렉션 아님)와 함께 보내야합니다. 예를 들어, 변경된 항목을 모두 업데이트하려면 각 항목에 대해 PUT 요청을 수행해야합니다. observableArray의 어느 항목이 추가/변경되었는지 감지하고 각 항목을 서버로 보내려면 어떤 방법이 있습니까 ??

답변

1

녹아웃은 기본적으로이 작업을 수행하지 않습니다. 내가 과거에 한 일은 배열에 저장된 객체에 isDirty 플래그를 설정 한 것입니다 (객체가 observables로 채워져 있다고 가정합니다. 그렇지 않을 경우 일반 js 객체를 사용하여 쉽게 수행 할 수 없습니다). is dirty 플래그는 변경 사항에 대해 관찰 가능한 속성을 감시하고 on이 설정되면 플래그를 true로 설정합니다. 만들어지고 저장하면 내가 그 위의 코드에서 볼 수

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

사실 IsDirty 사용에 대한 기록() == 당신이 관찰에 속성을 변환하지 않고 바로 배열로 반환 객체를 연결하면 그럼 그냥 참조하십시오. 속성을 변환하고 위의 비슷한 방법을 사용하는 것이 좋습니다.

+0

고맙습니다! 나는이 사건에 대해 생각했다. 그리고 이것이 내 문제를 해결하는 가장 적절한 방법 인 것 같습니다. – alinaish