我构建了一个系统,其中有一个用户界面,每次修改都必须向服务器(应用业务逻辑的服务器)发送 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/