Knockout observableArray vs WebApi Odata服务

时间:2014-03-26 07:56:27

标签: javascript knockout.js asp.net-web-api ko.observablearray jqwidget

我正在使用带有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中的哪些项被添加/更改并将每个项发送到服务器?

1 个答案:

答案 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。我建议转换属性并使用上面类似的方法。