1

我正在使用带有 Knockout.js 和 datajs 库(用于支持 OData)的 jQWidgets UI 框架来构建我的应用程序的客户端。以及服务器端 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); 
            });
        };

如您所见,我可以获取和删除项目。我的问题是如何保存所有更改并将刚刚更改的项目发送到服务器。对于服务器端的添加/更新实体,我必须使用适当的 json 对象(而不是对象集合)发送 POST/PUT 请求。因此,例如,如果我想更新所有更改的项目,我必须对每个项目执行 PUT 请求。有什么方法可以检测 observableArray 中的哪些项目被添加/更改并将这些项目中的每一个发送到服务器?

4

1 回答 1

1

淘汰赛并没有开箱即用。我过去所做的是在存储在数组中的对象中设置一个 isDirty 标志(这假设您的对象填充了可观察对象,如果不是,这将不起作用,并且使用常规 js 对象没有简单的方法来做到这一点)。isdirty 标志监视可观察的属性以进行更改,并且在启用时将标志设置为 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();
}

我在上面的代码中看到,您将返回对象直接插入到数组中,而无需将属性转换为可观察的。我建议转换属性并使用上面类似的方法。

于 2014-03-26T12:30:15.907 回答