在KnockoutJs中刷新UI后是否有回调?

时间:2013-11-20 20:38:48

标签: javascript jquery ajax knockout.js

不确定标题是否自我解释,但基本上我有一个邮政编码数组

this.zip_codes = ko.observableArray();

在某些时候,我有一个ajax调用,它获取要添加到数组的邮政编码列表

$('.spin').spin();
$.ajax(url, {
    data: {
        miles_min: 1,
        miles_max: 20
    }
}).done(function(data) {
    ko.utils.arrayForEach(data, function(value) {
        self.zip_codes.push(value);
    });
    $('.spin').spin(false);
});

此Knockout数组绑定到UI,它显示输入标记列表。

我添加了一个微调器来显示Ajax调用开始时的活动,并在Ajax调用结束时停止旋转。 问题是,如果我获得大量数据(+100),Knockout需要很长时间来更新UI。 如何在Knockout刷新UI之后而不是在Ajax调用之后立即停止微调器? 或者是因为我将值推送到数组的方式?

1 个答案:

答案 0 :(得分:2)

我建议将此更改开头:

$('.spin').spin();
$.ajax(url, {
    data: {
        miles_min: 1,
        miles_max: 20
    }
}).done(function(data) {
    var tmpArray = [];
    ko.utils.arrayForEach(data, function(value) {
        tmpArray.push(value);
    });
    self.zip_codes(tmpArray);
    $('.spin').spin(false);
});

这将立即推送所有值。如果不这样做,每次推送值时都会通知observable的订阅者,而不是在数组完全更新时通知。

至于你在UI更新后做事的问题,我找不到任何干净的方法。以下是我过去所做的事情来处理这个问题:

$('.spin').spin();
$.ajax(url, {
    data: {
        miles_min: 1,
        miles_max: 20
    }
}).done(function(data) {
    var tmpArray = [];
    ko.utils.arrayForEach(data, function(value) {
        tmpArray.push(value);
    });
    self.zip_codes(tmpArray);
    setTimeout(function() {$('.spin').spin(false)}, 0);
});

这似乎让处理器在调用setTimeout中的函数之前先控制HTML。