【问题标题】:First knockout update recursion第一次淘汰更新递归
【发布时间】:2014-05-16 02:37:29
【问题描述】:

我已经构建了一个系统,其中有一个用户界面,每次修改都必须向服务器(应用业务逻辑的地方)发送一个 Ajax 请求,然后发回一组新的 UI 值。此过程不会锁定 UI,因此您可以“链接”更改并同时处理多个 Ajax 请求。

我正在使用淘汰赛,显然想阻止这里发生递归更新,所以我所做的是:

  • 将自定义订阅者应用于每个可观察项目。
  • 当 observable 发生变化时,会发出 Ajax setFeatures 请求。
  • 一旦 Ajax setFeatures 请求完成,就会发生 Ajax getFeatures 并将数据返回给回调只有在没有其他 ajax 请求运行时
  • 回调设置一个标志,以防止创建额外的 Ajax setFeatures。
  • Knockout observables 已设置此时不应再发送 Ajax 请求
  • 该标志被还原以允许再次发送 Ajax 请求。

我注意到,第一次发生这个循环(setFeatures、getFeatures)时,每个淘汰赛 observable 都会触发另一个 setFeatures(在这里停止并且不会递归)。

在初始运行之后的任何时候,它都会按预期运行。大量的代码很难共享,但我相信这可能是由于以下原因:

  skipUpdate = true;

 // Update each of the knockout fields
 $(data).each(function () {
    var block = viewModel[this.Block];
    var item = block[this.Name]
    item.control.value(this.Value);    // item.control.value is the observable
 });

 skipUpdate = false;

由于 JavaScript 是单线程的,我是否正确假设在执行此代码块后更新了淘汰赛 observables?还是应该在 skipUpdate 标志中更新它们?

【问题讨论】:

  • 嗯,我有点理解你的问题,我很同情,但如果没有更接近小型复制品的东西,我们将很难为你提供帮助。恐怕您必须朝着这个方向努力,或者您最好还是躲避(或使用同事/朋友,这也可能有效)来解决这个问题。
  • @Jeroen 是的,明白这一点。正在部署中,当时无法轻松获取源代码,但我也试图理解理论而不是解决方案,这就是为什么我发布我的方法而不仅仅是代码

标签: javascript knockout.js


【解决方案1】:

通常情况下,被更改的可观察对象会立即通知其订阅者,因此任何计算的可观察对象或依赖于可观察对象的绑定都会同步更新。

为了避免这种更新和异步更新,你可以使用rate-limiting observable notifications,它是knockoutJS 3.1的新特性,之前有一个东西,叫做throttle extender

【讨论】:

  • 有趣的是,我实际上使用了一个,它的异步性可以解释我所看到的影响。会检查的。
  • 答案有点倒退,但解决了问题——当我使用 RateLimiter 时,异步更新发生在循环之后,skipUpdate 被设置回 false。
猜你喜欢
  • 2014-06-06
  • 1970-01-01
  • 1970-01-01
  • 2013-05-17
  • 1970-01-01
  • 2013-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多