Javascript 淘汰赛Array vs WebApi Odata服务
我正在使用jQWidgets UI框架以及Knockout.js和datajs库(用于支持OData)来构建我的应用程序的客户端。和服务器端ASP.NET Web API2中的OData端点。我为jqWidgets网格创建了ViewModel,如下代码所示:Javascript 淘汰赛Array vs WebApi Odata服务,javascript,knockout.js,asp.net-web-api,ko.observablearray,jqwidget,Javascript,Knockout.js,Asp.net Web Api,Ko.observablearray,Jqwidget,我正在使用jQWidgets UI框架以及Knockout.js和datajs库(用于支持OData)来构建我的应用程序的客户端。和服务器端ASP.NET Web API2中的OData端点。我为jqWidgets网格创建了ViewModel,如下代码所示: var vm = function() { this.items = ko.observableArray(); var self = this; //qet data from s
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请求。
有没有办法检测ObservalArray中哪些项目被添加/更改,并将这些项目发送到服务器 淘汰赛不能做到这一点。我在过去所做的是在数组中存储的对象中设置一个isDirty标志(这假设您的对象中填充了可观察对象,如果不是,这将不起作用,并且使用常规js对象也没有简单的方法)。is dirty标志监视可观察属性的更改,当启用时,它将标志设置为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();
}