异步ajax调用导致KnockOutjs出现问题

时间:2014-10-13 12:37:24

标签: asynchronous knockout.js

我点击了一个按钮,我打电话的是:

视图模型:

self.MyArray = ko.observableArray();

self.remove = function(c) {

    ko.utils.arrayForEach(c.sData(), function(ser) {
        if (ser.Check() == true) {
            self.MyArray.push(service);
            count++;
        }
    });

    if (count) {
        $.ajax({
            url: "/api/LoadCustomer/?reason=" + reason,
            cache: false,
            type: 'POST',
            contentType: 'application/json; charset=utf-8',
            data: ko.toJSON(self.MyArray),
            success: function(data) {
                ko.utils.arrayForEach(self.MyArray(), function(removedata) {
                    c.sData.remove(removedata);
                });
            }
        });
        self.MyArray([]);
    }

};

如果我在我的ajax调用中包含async:false我会把一切都搞定但是如果我没有包含async(它的默认属性是真的)我不知道在我的成功函数ajax呼叫self.MyArray()仍为Empty,但如果我保持虚假(尴尬)则不然。

有时候我担心,如果我在加载到可观察数组(OnLoad)时有async:true的一系列ajax调用,则可能存在轻微错位数据的可能性。

帮助我理解。

1 个答案:

答案 0 :(得分:5)

您的可观察数组MyArray为空的原因有时是因为在完成ajax调用之前执行了这行代码self.MyArray([]);。怎么样呢 -

if (count) {
    $.ajax({
        url: "/api/LoadCustomer/?reason=" + reason,
        cache: false,
        type: 'POST',
        contentType: 'application/json; charset=utf-8',
        data: ko.toJSON(self.MyArray),
        success: function (data) {
            ko.utils.arrayForEach(self.MyArray(), function (removedata) {
                c.sData.remove(removedata);
            });
        },
        complete: function() { // complete fires after success and error callbacks
            self.MyArray([]); // empty the array no matter what happens (error or success)
        }
    });
}