不确定标题是否自我解释,但基本上我有一个邮政编码数组
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调用之后立即停止微调器? 或者是因为我将值推送到数组的方式?
答案 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。