Javascript 淘汰赛Array vs WebApi Odata服务

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

我正在使用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 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();
}