javascript - 第一次 knockout 更新递归

标签 javascript knockout.js

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

我正在使用 knockout ,显然想防止此处发生递归更新,所以我所做的是:

  • 将自定义订阅者应用于每个可观察项目。
  • 当可观察值发生变化时,会发出 Ajax setFeatures 请求。
  • 一旦 Ajax setFeatures 请求完成,就会发生 Ajax getFeatures,并且仅当没有其他 Ajax 请求运行时才会将数据返回到回调
  • 回调会设置一个标志,以防止进行额外的 Ajax setFeatures。
  • Knockout 可观察值已设置此时不应发送更多 Ajax 请求
  • 该标志已恢复,以允许再次发送 Ajax 请求。

我注意到,这个循环第一次发生时(setFeatures、getFeatures),每个 knockout 可观察值都会触发另一个 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 是单线程的,我假设在执行此代码块后更新 knockout 可观察值是否正确?或者应该在skipUpdate 标志内更新它们?

最佳答案

通常,发生更改的可观察量会立即通知其订阅者,以便任何计算的可观察量或依赖于该可观察量的绑定(bind)都会同步更新。

要避免此类更新并异步更新,您可以使用 rate-limiting observable notifications 这是knockoutJS 3.1的新特性,在此之前有一个东西,叫做throttle Extender

关于javascript - 第一次 knockout 更新递归,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23684093/

相关文章:

javascript - angularjs ng-grid row 模板与启用单元格编辑冲突?

javascript - 获取 JSON 并遍历 react-native 中的值

javascript - 在分步向导中重置 knockout 验证中的错误

javascript - 可观察数组中的项目未添加到列表 KO

javascript - 这可以写成三元运算符吗?

javascript - AngularJS 在 Controller 之间共享异步数据

javascript - 如何将 opensocial 0.9 中的文件上传到应用程序服务器?

knockout.js - KnockoutJS - 使用条件语句计算出的可观察量如何工作

javascript - 单选按钮检查绑定(bind) html5,durandal

javascript - Knockout View 模型重置——当 Observables 需要默认值时