我正在使用带有Knockout.js和datajs库的jQWidgets UI框架(用于支持OData)来构建我的应用程序的客户端。和服务器端的ASP.NET Web API2中的OData Endpoint。我为jqWidgets Grid创建了ViewModel,如下面的代码所示:
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);
});
};
如您所见,我可以获取和删除项目。 我的问题是如何保存所有更改并将JUST更改的项目发送到服务器。对于服务器端的添加/更新实体,我必须使用适当的json对象(不是对象集合)发送POST / PUT请求。因此,例如,如果我想更新所有更改的项目,我必须为每个项目执行PUT请求。 有没有办法检测observableArray中的哪些项被添加/更改并将每个项发送到服务器?
答案 0 :(得分:1)
淘汰赛并不是开箱即用的。我过去所做的是在数组中存储的对象中设置一个isDirty标志(假设你的对象是用observables填充的,如果没有这个就行不通,并且没有简单的方法可以使用常规的js对象)。脏标志监视可观察属性的更改,并在启用时将标志设置为true。然后在进行保存时,您只需查看isDirty()== 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();
}
我在上面的代码中看到,您将返回对象直接插入到数组中,而不将属性转换为observable。我建议转换属性并使用上面类似的方法。