【问题标题】:Is there a callback for after UI refresh in KnockoutJs?在 KnockoutJs 中刷新 UI 后是否有回调?
【发布时间】:2013-11-21 05:38:19
【问题描述】:

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

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),淘汰赛需要很长时间才能更新 UI。 如何仅在 Knockout 刷新 UI 而不是在 Ajax 调用之后才停止微调器? 还是因为我将值推送到数组的方式?

【问题讨论】:

  • 100 个邮政编码(如果返回的每组数据中只有这些的话)根本不需要很长时间,除非生成的 KO html 非常疯狂。你能发布一些更相关的代码吗?
  • 你能在绑定的地方显示 html 标记吗?
  • 确实,我更新数组的方式似乎是个问题。我仍在尝试找出标记是如何绘制的...
  • 所以我发现了为什么添加 +100 邮政编码很慢。这似乎是我的 Knockout 版本的一个错误......

标签: javascript jquery ajax knockout.js


【解决方案1】:

我建议从以下开始进行更改:

$('.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。

【讨论】:

  • 事实上变量数据已经是一个数组,我不确定为什么其他开发人员选择一个一个地推送每个值。我试过你的方法,肯定会快得多。并且设置超时也有效。谢谢。
猜你喜欢
  • 2014-03-07
  • 2020-03-08
  • 2017-10-04
  • 2019-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-30
  • 1970-01-01
相关资源
最近更新 更多