【发布时间】: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 是的,明白这一点。正在部署中,当时无法轻松获取源代码,但我也试图理解理论而不是解决方案,这就是为什么我发布我的方法而不仅仅是代码